This question already has answers here:
Self-references in object literals / initializers
                            
                                (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的值。

为什么t3t2分配在Object.defineProperties中不起作用?

演示在这里:http://jsfiddle.net/HrLLQ/

最佳答案

这里的问题是关于this元素的。

调用.defineProperties()时,this元素不引用您所在的对象,也不是父对象或父对象,而是引用函数thisdefineProperties元素,实际上是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