標籤:tac pre define var 總結 常用 his 代碼 屬性
看js訪問器屬性時候 有這樣一段代碼
var book = { _year: 2004, edition: 1 } Object.defineProperty(book, ‘year‘, { get: function () { return this._year; }, set: function (val) { if (val > 2004) { this._year = val; this.edition += val - 2004; } } }); book.year = 2005; console.log(book.edition); console.log(book.year); console.log(book._year);
書中說’ _year ‘表示是一種常用標記。表示只能通過對象訪問的屬性。
所以我認為它只是一種標記,可以更改 於是乎我就把‘_year‘ 改成了 ‘year‘
var book = { year: 2004, edition: 1 } Object.defineProperty(book, ‘year‘, { get: function () { return this.year; }, set: function (val) { if (val > 2004) { this.year = val; this.edition += val - 2004; } } }); book.year = 2005; console.log(book.edition); console.log(book.year); console.log(book.year2);
可是卻爆了這樣一個錯誤
Uncaught RangeError: Maximum call stack size exceeded 翻譯過來就是堆疊溢位了。。。
這個問題先擱置,我們再試一下‘_year‘ 改成了 ‘year2’
var book = { year2: 2004, edition: 1 } Object.defineProperty(book, ‘year‘, { get: function () { return this.year2; }, set: function (val) { if (val > 2004) { this.year2 = val; this.edition += val - 2004; } } }); book.year = 2005; console.log(book.edition); console.log(book.year); console.log(book.year2);
這次又好了。所以我認為書中’year‘有些迷惑人
再來一個終極版本
var book = { year: 2004, edition: 1 } Object.defineProperty(book, ‘updateAll‘, { get: function () { return book;//此處可以自訂 別人訪問時候返回什麼,如果什麼都不寫 就代表這個屬性不讓訪問 }, set: function (val) { if (val > 2004) { this.year = val; this.edition += val - 2004; } } }); book.updateAll = 2005; console.log(book.edition); console.log(book.year); console.log(book.updateAll);
總結:原來訪問器屬性,(不是對象屬性) 名字隨意起名。它的作用就是 決定 你訪問或者設定 這個屬性的時候 是拒絕,還是做很多事情,比如更新本對象的全部屬性,等等。。
至於剛才記憶體溢出,就是因為我們 訪問器屬性的名字 和對象屬性的名字一樣了, 所以在 這一句 <pre>this.year = val;</pre> 的時候 我們本意是打算調用對象屬性,但實際上它又調用了 訪問器屬性,形成了遞迴。so~~~
js訪問器屬性之小問題