我們來看下面一段代碼:
~~~
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) `
~~~