gpt4 book ai didi

Javascript 访问器属性混淆

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:42:22 24 4
gpt4 key购买 nike

我不确定为什么这段代码会给我一个错误。我想要做的就是创建一个具有数组作为属性的对象。我想用 setter 和 getter 来实现这一点,但出于某种原因,当我在 setArray 函数中执行 this.array = [] 时,我得到了超出最大调用堆栈大小。我究竟做错了什么 ?关于 Javascript 的访问器属性,我缺少什么。

var obj = {
set array(size) {
this.array = [];
for (var i = 0; i < size; i++){
this.array[i] = i;
}
}
};


var myObj = Object.create(obj);
myObj.array = 20;

最佳答案

您正在从 setter 中分配给带有 setter 的属性,这就是它永远递归的原因:

var obj = {
set array(size) { // <== The property is called `array`
this.array = []; // <== This calls the setter
for (var i = 0; i < size; i++){
this.array[i] = i; // <== This would fail because there's no getter
}
}
};

您必须将值存储在别处,例如在这里我们创建一个私有(private)范围并关闭一个变量:

var obj = (function() {
var array = [];
return {
set array(size) {
array = []; // No `this` here
for (var i = 0; i < size; i++) {
array[i] = i; // No `this` here
}
},
showArray() {
console.log(array);
}
};
})();

var myObj = Object.create(obj);
myObj.array = 20;
myObj.showArray();

您询问了关于避免该功能的问题。您需要使属性的值真正私有(private)的函数。但是,如果您出于某种原因不想使用它,并且您对它的真正私密性并不那么在意,您可以像 Zoltán Tamási 在 his answer 中所做的那样。 :在同一个对象上使用另一个属性。他的回答在基础属性上使用了 _ 前缀(例如,_array),这是 JavaScript 中非常的常见约定,表示“别管它,它是‘私有(private)的’”,即使没有私有(private)属性。事实上,即使在具有真正私有(private)属性的语言中(如 Java,它们被称为实例字段),通常也有某种形式的强大反射机制可以用来绕过它,所以...

如果您这样做,需要考虑的一件事是您是否希望在序列化时将私有(private)属性包含在 JSON 中。如果没有,也只需实现 toJSON,这样您就可以控制在序列化过程中包含哪些属性:

var obj = {
_array: [],
foo: "a value to include in JSON",
set array(size) {
this._array = []; // Note the _
for (var i = 0; i < size; i++) {
this._array[i] = i;
}
},
showArray() {
console.log(this._array);
},
toJSON() {
return {
// Here we list only the properties we want to have
// included in the JSON
foo: this.foo
};
}
};

var myObj = Object.create(obj);
myObj.array = 20;
myObj.showArray();
console.log(JSON.stringify(myObj));

关于Javascript 访问器属性混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37971731/

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