gpt4 book ai didi

Javascript DefineProperty 和 Object.keys 返回困境

转载 作者:行者123 更新时间:2023-11-28 12:30:23 25 4
gpt4 key购买 nike

/**
* @author paula
*/
var myObj = {};
Object.defineProperty(myObj, "prop1", {
get: function(){return this._prop1;},
set:function(value){this._prop1 = value;},
enumerable:true});

Object.keys(myObj) // Note that returns ["prop1"]
myObj.prop1 = "Hello"; // call set
Object.keys(myObj); // Returns ["prop1", "_prop1"]
myObj // Object {prop1: "Hello", _prop1: "Hello"}

作为先决条件,我有一个空对象,可以使用 Object.properties 来填充属性。定义属性。困境是我只想创建一个属性 - ["prop1"] 在上面的示例中,根据 Object.keys() 返回的内容,看起来创建了 2 个属性 - ["prop1", "_prop1"]。

问题:“prop1”的名称是什么 - 是属性还是伪属性?“prop1”和“_prop1”同时使用 name 属性是否正确?

我也尝试过这个解决方案:

var myObj1 = {};
Object.defineProperty(myObj1, "prop1", {
get: function(){return this.prop1;},
set:function(value){this.prop1 = value;},
enumerable:true});
myObj1.prop1= "Bye"

并收到此错误:“RangeError:超出最大调用堆栈大小”,这是因为 set 在无限循环中一遍又一遍地调用相同的代码而触发的。我想知道是否有解决这个“RangeError:最大调用堆栈...”问题? (可能重复)。谢谢。

最佳答案

Question: What is the name for "prop1" - is a property or it's kind of pseudo-property ? Is it correct to be used the name property for both "prop1" and "_prop1" ?

是的,两者都是属性。 prop1 是一个访问器属性(带有 getter/setter),而 _prop1 是一个数据属性(简单的、可写的值) )。

要解决您的问题,只需不要使用访问器属性即可:

Object.defineProperty(myObj, "prop1", {
// value: undefined,
writable: true,
enumerable: true
});

如果出于某种原因需要访问器属性,请将值存储在闭包变量中或不可枚举的“隐藏”属性中:

(function() {
var value;
Object.defineProperty(myObj, "prop1", {
get: function(){ return value; },
set: function(v){ value = v; },
enumerable:true
});
})();

Object.defineProperties(myObj, {
"_prop1": {
enumerable: false,
writable: true
},
"prop1": {
get: function(){ return this._prop1; },
set: function(value){ this._prop1 = value; },
enumerable:true
}
});
Object.keys(myObj) // ["prop1"]

关于Javascript DefineProperty 和 Object.keys 返回困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22693111/

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