我對JS-學習的目的下面的代碼:JavaScript的 - 如何保存的狀態「這個」正確
function A() {
var self = this;
this.test1 = function() {
console.log("A_test1");
B().test2();
return self;
}
this.problem = function() {
console.log("I'm never called");
}
return self;
}
function B() {
var self = this;
this.test2 = function() {
console.log("B_test2");
return self;
}
this.problem = function() {
console.log("I'm a headach and overwrite others in my free time");
}
return self;
}
/*
* This is our "main" function like in C
*/
$(function(){
A().test1().problem();
});
我已經調試與螢火蟲的代碼。讓我們從「main」函數逐步檢查下面的行: A()。test1()。problem();
1) A()
「關鍵字‘這個’不是一個函數(類)對象,它總是‘窗口’對象,即由線在延伸線運行時間由當前對象的屬性/方法(在我們的例子中爲A的函數對象)所以當我們到達A()的末尾時(即「返回自我」),「this」對象的內容如下:
- 「窗口」對象的所有屬性/方法
- test1()和一種
2) A()TEST1()
TEST1()方法具有線的問題()方法 「B()TEST2();」。因此,它作爲調用next B()
2.1) B()
當我們到達B的結束()(即返回self),在 「此」 對象中的內容如下:
- 所有屬性/ 「窗口」 對象的方法
- TEST1()的方法A
[問題()A的方法丟失,因爲它是由B的問題()重寫] - test2()和問題()乙
2.2) B的方法(i)。TEST2()
此運行正常,並處於正常。所以我們用A()。test1()來表示。
3) A()。test1()。problem();
而這個調用B的problem()方法,雖然我想在這裏調用A的問題()。
那麼保存「this」對象的在線狀態的正確方法是什麼? (很明顯,「自我」在這裏完全沒有任何作用,因爲它是一個參考(與C中一樣)「this」物體。)
我可以在開始時克隆「this」 - 對象的狀態每一個構造函數,即:中
代替
var self = this;
怎麼樣
var self = this.clone();
,但我不知道這是否是一個好主意。因爲爲每個新創建的對象克隆「this」的狀態會在大型框架中殺死內存,不是嗎?
我敢肯定,我不是第一個與這個問題對抗的人。我的Google搜索給了我不多。那麼,拯救「這個」的正確方法又是什麼?我如何讓A的問題()在本例中被調用而不是B的問題()?
您需要使用'A'作爲構造函數,即'var a = new A()',那麼'this'將指向一個新的對象而不是'window' – 2013-05-02 04:55:08
@ArunPJohny:將其作爲答案發布。 – icktoofay 2013-05-02 04:55:49
@icktoofay done – 2013-05-02 04:57:20