在javascript中使用'this'中的相同对象的键值对

时间:2015-02-06 02:51:41

标签: javascript object

我们说我有两个对象,比如

var a = {
    b: 1,
    c: this.b
};

并且

var funcObj = {
    b : function() {
        return 1;
    },
    c: function() {
       console.log(return this.b())
    }
}

记录这两个像

console.log(a.c)//results undefined
console.log(funcObj.c()) //results 1

为什么第一个函数不能使用this属性,但第二个函数可以使用? 我真的很困惑。

2 个答案:

答案 0 :(得分:3)

答案取决于每个上下文中this引用的内容。在JavaScript中,当调用当前函数时,this绑定到点(。)左侧的任何对象。如果我们不在某个功能中,事情就会变得更加毛躁 - this可以是全局window对象,也可以是undefined,具体取决于环境。

在您的第一个示例中,this的值取决于周围的上下文。当JavaScript构建您的对象a时,它会评估this.b。当前绑定的任何对象this没有b属性,因此c属性设置为undefined

在第二个示例中,当您致电funcObj.c()时,函数中的this将绑定到funcObj。因此,当您要求b属性时,您将获得上面定义的bfuncObj.b是一个函数的事实实际上是无关紧要的。以下也适用:

var funcObj = {
    b :  1,
    c: function() {
       console.log(return this.b)
    }
}

答案 1 :(得分:2)

您不能将声明中的其他属性作为Javascript文字声明的一部分引用。所以,在你的Javascript文字声明中:

var a = {
    b: 1,
    c: this.b
};

this未设置为您想要的内容且a尚未初始化,因此您也无法引用它。在文字声明时根本没有办法到达其他属性。这是Javascript当前规范的限制。你可以这样做:

var a = {
    b: 1
};
a.c = a.b;

因为此时a已完全形成,因此您可以引用其中的其他属性。


或者,在现代浏览器中,您甚至可以使用getter来获取" live"像这样的b版本(它不是与您要求的完全相同的功能,因为它是{"生活"版本的b将跟踪它& #39; s值),但显示了另一种可能性:

var a = {
    b: 1,
    get c() {
         return b;
    }
};

console.log(a.c); //results 1

在你的第二个例子中:

var funcObj = {
    b : function() {
        return 1;
    },
    c: function() {
       console.log(return this.b())
    }
}

console.log(funcObj.c()) //results 1

您正在调用funcObj.c()并将this内的c值设置为funcObj,因此您可以通过this引用其他属性。


这里的主要区别是this未设置为Javascript文字定义(第一个示例)中的对象,但在调用方法时this设置为对象{ {1}}。