我们来看下面一段代码:
~~~
var MyObject = function() {}
MyObject.prototype.whoAmI = function() {
console.log(this === window ? "window" : "MyObj"); };
var obj = new MyObject();
~~~
现在为了方便起见,我们新建一个变量来指引 whoAmI 方法, 因此我们可以直接用 whoAmI() 而不是更长的obj.whoAmI():
~~~
var whoAmI = obj.whoAmI;
~~~
接下来为了确保一切都如我们所预测的进行,我们可以将 whoAmI 打印出来:
~~~
console.log(whoAmI);
~~~
结果是:
~~~
function () { console.log(this === window ? "window" : "MyObj"); }
~~~
没有错误!
但是现在我们来查看一下两种引用的方法:
~~~
obj.whoAmI(); // 输出 "MyObj" (as expected)
whoAmI(); // 输出 "window" (uh-oh!)
~~~
哪里出错了呢?
原理其实和上面的第二个常见错误一样,当我们执行 var whoAmI = obj.whoAmI;的时候,新的变量 whoAmI 是在全局环境下定义的。因此它的this 是指window, 而不是obj!
正确的编码方式应该是:
~~~
`var MyObject = function() {}
MyObject.prototype.whoAmI = function() {
console.log(this === window ? "window" : "MyObj"); };
var obj = new MyObject();
obj.w = obj.whoAmI; // still in the obj namespace obj.whoAmI(); // 输出 "MyObj" (as expected)
obj.w(); // 输出 "MyObj" (as expected) `
~~~