我有以下构造函数:
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分配?
答案 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