This question already has answers here:
Self-references in object literals / initializers
(23个答案)
5年前关闭。
这就是我使用
现在我要打印
但是我可以使用
为什么
演示在这里:http://jsfiddle.net/HrLLQ/
为了使其正常工作,您必须将
因此,一旦创建对象,其
(23个答案)
5年前关闭。
这就是我使用
Object.defineProperties
生成objct的方式: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
的t2
分配在Object.defineProperties
中不起作用?演示在这里:http://jsfiddle.net/HrLLQ/
最佳答案
这里的问题是关于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)。10-08 07:19