这是我使用Object.defineProperties
生成对象的方式:
var obj = {
t3: 3,
t1: Object.defineProperties({}, {
getT3: {
value: function () {
console.log(this.t3);
}
},
t2: {
value: this.t3
},
t3: {
value: 4
}
})
}
现在我要打印obj.t1.t2
值:console.log(obj.t1.t2)
,但返回结果为undefined
但我可以使用obj.t1.getT3()
方法获取obj.t1.t3
的值;
为什么t3
的{{1}}作业无法在t2
中发挥作用?
DEMO在这里:http://jsfiddle.net/HrLLQ/
答案 0 :(得分:1)
这里的问题是关于this
元素。
当您致电.defineProperties()
时,this
元素不会引用您所在的对象,或者它的父级或监视器,但它指的是this
元素函数defineProperties
,实际上是window
。
以下是一个例子:
var foo = { bar: 10, b: { c: this, d: this.bar } }
console.log(foo.b.d); // logs undefinded, because the window object has no attribute .bar
console.log(foo.b.c); // logs the window object
function x() { y = this }
x();
console.log(y); // also logs the window object
要使其工作,您必须将.t2
属性定义为如下函数:
function() { return this.t3 }
因此,一旦创建了对象,其this
元素将为obj
,obj.t1.t2()
将返回obj.t3
(实际上为3)。
答案 1 :(得分:0)
我认为您无法像上面那样访问this
。只需将t2
定义为函数,它就可以正常工作
var obj = {
t3: 3,
t1: Object.defineProperties({}, {
getT3: {
value: function () {
console.log(this.t3);
}
},
t2: {
value: function(){
return this.t3;
}
},
t3: {
value: 4
}
})
}
console.log(obj.t1.t2());
obj.t1.getT3();