javascript - 创建自定义 get/set 时为 "Stack size exceeds"

标签 javascript setter getter

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

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

谢谢

最佳答案

您不能既拥有属性的 getter,又希望通过相同的名称引用存储的属性。两者择其一。

这会创建一个无限循环:

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

您实质上是说,每当有人请求 year 属性时,它就应该使用您的 getter 函数。并且,在 getter 函数内部,您再次调用 getter 函数,该函数再次调用 getter 函数……直到堆栈爆炸。此语句 return this.year 将简单地调用 getter 函数。

哦,仅供引用,您的 setter 函数也有同样的问题。

<小时/>

如果您想要一个地方来存储year属性值,那么您必须使用不同的属性名称或使用某种闭包变量(例如私有(private)实例值)。您不能同时拥有 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);

关于javascript - 创建自定义 get/set 时为 "Stack size exceeds",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31419169/

相关文章:

Javascript setter - 如何获取 setter 内部的 setter 名称?

actionscript-3 - 如何在 Haxe 中正确重写 getter 和 setter

java, spring boot 在运行时自动生成 getter 和 setter

javascript - 做一个对外只读的属性,但是我的方法还是可以设置的

c++ - 为什么访问函数必须是 const?漏洞在哪里?

javascript - ng-src 无法正常工作

javascript - 仅在参数类型检查时实例化 JavaScript 构造函数

javascript - 不使用 JQuery 实现 onclick 事件

javascript - 调用一次工厂函数

c++ - C++ 中静态类变量的静态或非静态 getter/setter