2013-05-02 20 views
0

我對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的問題()?

+0

您需要使用'A'作爲構造函數,即'var a = new A()',那麼'this'將指向一個新的對象而不是'window' – 2013-05-02 04:55:08

+0

@ArunPJohny:將其作爲答案發布。 – icktoofay 2013-05-02 04:55:49

+0

@icktoofay done – 2013-05-02 04:57:20

回答

2

你需要使用A作爲構造即var a = new A(),那麼這將指向一個新的對象,而不是在JavaScript window

+0

我應該總是調用一個函數,而不是使用「new」關鍵字嗎?它有任何副作用嗎? (例如創建重複的函數對象) – 2013-05-02 05:03:17

+1

@ moller1111不,如果您正在處理對象,則需要使用'new' – 2013-05-02 05:12:39

+0

謝謝。我會接受你的答案,因爲你是第一位的,而你根據我的需要回答了額外的問題。對於閱讀此評論的任何人:請查看「UmurKontacı」的「自我」提示以及下面的「jdigital」的推薦書籍鏈接。 – 2013-05-02 05:19:15

1

如果你打電話new你的函數,然後將this,其實是對象的實例,而不是窗口...所以...

function Foo(){ 
    this.whatAmI = function(){ 
     console.log("I am " + this); 
    } 
} 


var bar = new Foo(); 
bar.whatAmI(); 
2
var x = new A(); 

new關鍵字的特徵在於設置this變量到新instanc即如果您只使用var x= A();而不是this,則A函數將爲window(即全局上下文)。

對於這些簡單的設置,您不需要使用var self = this;,直到您需要回調爲止,但爲了方便起見,您可以在沒有任何副作用的情況下執行此操作。爲此設置一個變量的值是完全正確的,並且非常常見,變量的名稱通常是that而不是self,但這只是糖。

+0

'Function.prototype.bind'有時也可以使用。 – icktoofay 2013-05-02 04:58:16

+0

thx回調提示 – 2013-05-02 05:07:55

+0

@icktoofay'bind'在ECMAScript 5中;所以它在舊版瀏覽器上不可用。順便說一句,你如何將它綁定到一個新的對象(即複製新)? – 2013-05-02 05:28:30

1

其他答案(「使用new」)是正確的。

我想你會從John Resig的作品中受益。看看他的書(Secrets of the Javascript Ninja)或在他的網站上查看the interactive Javascript tutorial

+0

我應該總是調用一個函數,而不是使用「new」關鍵字嗎?它有任何副作用嗎? (例如像創建重複的功能對象) – 2013-05-02 05:06:56

+0

不,你不應該。這就是爲什麼我建議查看教育資料 - 以便您可以更好地瞭解其工作原理。 – jdigital 2013-05-02 05:07:47