js訪問器屬性之小問題

來源:互聯網
上載者:User

標籤: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訪問器屬性之小問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.