3 回答

TA貢獻8條經驗 獲得超19個贊
書中有說明的(以下是原文):
訪問器屬性不包含數據值;它們包含一對兒 getter 和 setter 函數(不過,這兩個函數都不是必需的)。
在讀取訪問器屬性時,會調用 getter 函數,這個函數負責返回有效的值;在寫入訪問器屬性時,會調用
setter 函數并傳入新值,這個函數負責決定如何處理數據。
訪問器屬性不包含數據值;它們包含一對兒 getter 和 setter 函數(不過,這兩個函數都不是必需的)。
在讀取訪問器屬性時,會調用 getter 函數,這個函數負責返回有效的值;在寫入訪問器屬性時,會調用
setter 函數并傳入新值,這個函數負責決定如何處理數據。
訪問器屬性不能直接定義,必須使用 Object.defineProperty() 來定義。
_year 前面的下劃線是一種常用的記號,用于表示只能通過對象方法訪問的屬性。而訪問器屬性 year 則包含一個
getter 函數和一個 setter 函數。getter 函數返回 _year 的值,setter 函數通過計算來確定正確的版本。
我的理解:
_year是一個只能通過對象方法訪問的內部屬性,用于存儲對象方法需要用到的值。
而訪問器屬性year通過Object.defineProperty() 來定義,本身不包含數據值,使用get和set讀取和設置對象中的屬性值,返回值。(year沒有在對象字面量中直接體現)
_year≠year,_year是普通的屬性,只是前面添加了"_"表示其不能直接訪問;year是訪問器屬性,本身就沒有數值,主要的工作是定義出來操作_year和edition的值,它也可以訪問_year并直接返回_year存儲的內容,比如它的get方法。
另外,書中的定義多個屬性Object.defineProperties()恰好可以解釋_year和year是兩個不同的屬性,書中代碼如下:
var?book?=?{}; Object.defineProperties(book,?{ ????_year:?{ ????????value:?2004 ????}, ????edition:?{ ????????value:?1 ????}, ????year:?{ ????????get:?function(){ ????????????return?this._year; ????????}, ????????set:?function(newValue){ ????????????if?(newValue?>?2004)?{ ????????????????this._year?=?newValue; ????????????????this.edition?+=?newValue?-?2004; ????????????} ????????} ????} });
以上代碼在 book 對象上定義了兩個數據屬性( _year 和 edition )和一個訪問器屬性( year )。
最終的對象與上一節中定義的對象相同。唯一的區別是這里的屬性都是在同一時間創建的。
以上內容僅供參考。如有理解錯誤,請指出,不勝感激!

TA貢獻1036條經驗 獲得超461個贊
他這個_year 只是在內部用的,其實對外用的是year ?他這樣做就相當于給 book又添加了一個year屬性嘛 只不過你在取year值時,他內部去取的是_year的值,賦值時也是一樣,你賦給的是year ,他在內部又把這個值賦給了_year
添加回答
舉報