我想在初始化对象时设置属性x,然后调用Object.defineProperty。如果我尝试首先访问foo.x,控制台会告诉我“值未定义”。
var foo = {x:20};
Object.defineProperty(foo, "x", {
writeable: true,
enumerable: true,
configurable: true,
get: function(){
console.log("Get X value");
return value;
},
set: function(newValue){
console.log("Set X value");
value = newValue;
}
});
console.log(foo.x); // **Uncaught ReferenceError: value is not defined**
foo.x = 1;
console.log(foo.x);
foo.x = 10;
console.log(foo.x);
答案 0 :(得分:0)
每个属性都有一个'描述符'。如果你在下面介绍这个代码,你会看到这个......
var foo = {x:20};
var des = Object.getOwnPropertyDescriptor(foo,'x');
console.log('foo.x - descriptor =',des);
foo.x
的描述符如下所示:
Object {
value : 20,
writable : true,
enumerable : true,
configurable : true
}
正如您所见configurable
,enumerable
和writable
已经预先设置为true
,因此无需在defineProperty
中执行此操作}。
另外......如果描述符有get
或set
,则CAN' T有value
或writable
,反之亦然,因此会导致这样的错误:
Object.defineProperty(foo,'y',{
value : 5,
get : function(){return 10}
});
会给出错误:
Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute.
"存取"是get
& set
。
我了解到您正在尝试获取/设置foo.x
的值,但您还没有为value
定义任何内容。有点像,但不是:
Object.defineProperty(foo, "x", {
var value = this;
总而言之,你是以错误的方式解决这个问题。看看这段代码,看看它是否有帮助:
var foo = {x:20};
Object.defineProperty(foo,'y',{
get : function(){
console.log('Get foo.x');
return this.x;
},
set : function(val){
console.log('Set foo.x');
this.x = val;
}
});
console.log(foo.x); // 20
console.log(foo.y); // get foo.x (20)
foo.y = 10; // set foo.x to 10
console.log(foo.x); // 10
console.log(foo.y); // 10