/**
* @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填充属性的空对象。 defineProperty。困境是我只想创建一个属性 - [“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:最大调用堆栈......”问题的任何解决方案? (可能重复)。感谢。
答案 0 :(得分:4)
问题:" prop1"的名称是什么? - 是一种财产还是它的伪财产?为" prop1"使用name属性是否正确?和" _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"]
答案 1 :(得分:1)
在你的二传手中执行此操作时:
this._prop1 = value;
您正在创建“_prop1”属性。如果您不希望它是可枚举的,请按以下方式定义:
Object.defineProperty(myObj, "_prop1", { enumerable:false });