gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 09:33:20 24 4
gpt4 key购买 nike

所以我有两个“名称”作为属性和作为在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com