创建自定义获取/设置时"Stack size exceeds"



所以我有两个"name"作为属性和作为Object.defineProperty()传递的参数。如果我选择将命名约定与我的图书对象以及object . defineproperty()的"name"相同,我将在控制台上得到一个错误调用"堆栈大小超过"。两者的确切区别是什么?这有什么关系呢?

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

你不可能既拥有属性的getter,又期望以相同的名称引用存储属性。二选一

创建一个无限循环:

Object.defineProperty(book, "year",{
    get: function(){
        return this.year;
    },
...

你实际上是在说任何时候有人请求year属性,那么它应该使用你的getter函数。在getter函数中,你再次调用getter函数它再次调用getter函数。直到那堆炸药爆炸。语句return this.year将简单地调用getter函数。

哦,顺便告诉你,你的setter函数也有同样的问题。


如果你想要一个地方存储year属性值,那么你将不得不使用不同的属性名称或使用某种闭包变量(例如私有实例值)。你不能同时拥有getter和setter以及你实际存储值的名称的属性。二选一


一个简单的解决方案是更改存储实际值的属性值的名称,然后阻止任何代码直接访问该值:

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);

相关内容

最新更新