在JavaScript中为属性引用分配属性

时间:2013-12-20 22:58:03

标签: javascript

我有以下构造函数:

function myObject(){
    this.age = 43;
    this.getAge = function(){
        return this.age;
    }
}

我用它创建一个新对象

myInstance = new myObject();

然后将getAge方法分配给变量引用

myReference = myInstance.getAge;

来自原始构造函数的现在引用myReference。然后我添加以下

myReference.age = 99;

但是当我运行myReference()时,浏览器返回undefined。我运行以下内容进行调试

console.log(myReference)

只看到getAge函数;年龄属性不存在。为什么没有应用myReference.age分配?

1 个答案:

答案 0 :(得分:3)

运行“myReference”函数时,无需任何上下文即可运行它。因此,在函数中,this的值将是全局上下文(window)或undefined

如果你这样做:

console.log( myReference.call(myReference) );

你得到99.那是因为你明确告诉运行时系统调用函数,this设置为函数本身。你也可以这样做:

myReference.getAge = myReference;
console.log( myReference.getAge() );

这应该也有效。当然,这是一种相当令人困惑的做事方式,并不是真正惯用的JavaScript。需要注意的是this由函数调用的方式决定,而不是函数定义的方式。此外,this通常与函数本身无关,除非你做了一些事情来安排(这有点奇怪)。

您还可以使用.bind创建“getAge”函数的绑定版本。如果你想要一个绑定到实例的函数(我觉得这很有意义),你可以这样做:

var myReference = myInstance.getAge.bind( myInstance );

现在在“myReference”上设置“age”属性不会影响实例上的属性:

myReference.age = 99;
console.log( myReference() ); // logs 49

但是在实例上设置属性将:

myInstance.age = 99;
console.log( myReference() ); // logs 99