javascript - "Stack size exceeds" when creating custom get/set -


so have 2 "name" property , parameter passed on object.defineproperty(). if choose put naming convention same on "name" book object object.defineproperty() getting error call "stack size exceeds " on console. exact difference between two? , how matters.

var book ={   year: 2004,   edition : 1 };      object.defineproperty(book, "year",{       get: function(){         return this.year;       },       set:function(newvalue){         if(newvalue > 2004){           this.year = newvalue;           this.edition = this.edition + newvalue -2004;         }       }     });      book.year = 2005;     alert(book.edition); 

thank

you can't have both getter property , expect refer stored property same name. it's 1 or other.

this creates infinite loop:

object.defineproperty(book, "year",{     get: function(){         return this.year;     }, ... 

you're saying anytime requests year property, should use getter function. and, inside getter function, call getter function again calls getter function again ... forever until stack blows up. statement return this.year call getter function.

oh, , fyi, have same issue in setter function too.


if want place store year property value, have either use different property name or use sort of closure variable (e.g.a private instance value). cannot have both getter , setter , property of name store value in. it's 1 or other.


a simple solution change name of property value store actual value , discourage code directly accessing value:

var book ={   _year: 2004,   edition : 1 };      object.defineproperty(book, "year",{       get: function(){         return this._year;       },       set:function(newvalue){         if(newvalue > 2004){           this._year = newvalue;           this.edition = this.edition + newvalue -2004;         }       }     });      book.year = 2005;     alert(book.edition); 

Comments