我有这段代码:
function Test2() {
this.data = 1;
this.unaccesible = 7;
}
Object.defineProperty(Test2.prototype, "data", {
get: function() {
return this.data;
},
set: function(nv) {
// here this.unaccesible is undefined - why?
console.log(this.unaccesible);
}
});
var o = new Test2();
o.data = 2;
为什么属性在setter中不可用?
console.log(this.unaccesible);
答案 0 :(得分:2)
因为您在原型上定义了属性,而不是Test2的实例。 this.data
仅可访问,因为您正在定义属性data
。它与Test2的构造函数中设置的data
不同。
答案 1 :(得分:1)
当创建Test2的实例并执行第2行this.data = 1
时,这是定义的,并且它具有原型,其具有"数据"属性但实例本身没有"数据"然而。这就是为什么调用原型的数据属性设置器方法并且它在this.unaccesible = 7
之前发生的原因。这就是为什么this.unaccesible在这一点上未定义的原因
答案 2 :(得分:0)
您需要为每个变量创建单独的Object.defineProperty
。
有关注释的代码示例,请查看以下小提琴。希望这能解答您的疑问。
JSfiddle example for the problem
或查看下面的相同代码
function Test2() {
this.data = 1;
this.unaccesible = 5;
}
Object.defineProperty(Test2.prototype, "unaccesible", {
get: function() {
return this.data;
},
set: function(nv) {
// here this.unaccesible is undefined - why?
// You cannot access "unaccesible" directly as the parameter for the
// setter function is nv.
var test = nv;
alert("Unaccessible:" + test);
}
});
// Use object.defineProperty for each variable as follows to set data value
Object.defineProperty(Test2.prototype, "data", {
get: function() {
return this.data;
},
set: function(nv) {
// here this.unaccesible is undefined - why?
// You cannot access "unaccesible" directly as the parameter for the
// setter function is nv.
var test = nv;
alert("Data:" + test);
}
});
var o = new Test2();
//This sets the value of unaccesible to 2 after the intial value 5 is stored.
o.unaccesible = 6;
//This sets the value of data to 2 after the intial value 1 is stored.
// This is executed after unaccesible
o.data = 2;