Javascript:混淆Object.defineProperties函数

时间:2014-07-31 02:56:43

标签: javascript object

这是我使用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/

2 个答案:

答案 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元素将为objobj.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();