2009-11-18 92 views
1

我有有這樣的JS類測試:Javascript:如何重寫某些類中的公共方法?

SomeClass = function { 
    // some stuff that uses initRequest  
    this.initRequest = function() { 
     if (window.XMLHttpRequest) { 
      return new XMLHttpRequest(); 
     } else if (window.ActiveXObject) { 
      return new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
    } 
} 

我要重寫方法initRequest用於測試目的。我試圖做這樣的事情

var request = new MockXmlHttpRequest(); 
var instance = new SomeClass(); 
instance.initRequest = function() { 
    return request; 
}; 
// some calls of the SomeClass methods that use initRequest 
// some test code with assertions for the request 

仍然調用initRequest方法調用實際的原代碼,但不是說我試過的功能傳遞給instance.initRequest

任何想法有什麼不對?

回答

0

在你的第一個例子,initRequest返回每次通話後一個新的對象;在第二個例子中,所有對initRequest的調用都返回對唯一(模擬)對象的引用。

請求對象在您提供的代碼示例中未更改。 instance.initRequest簡單地返回請求的引用。爲什麼期望它發生了變化?

+0

由於 的//的使用initRequest – DixonD 2009-11-20 02:13:48

+0

你有沒有使用螢火檢查調用之前和之後請求SomeClass的方法的一些電話?我發現FireBug是必不可少的。也許你可以發佈額外的代碼? – Upperstage 2009-11-20 18:16:39

0

因爲你的英語,我對理解你的問題有點困難,但我會盡力回答(如果我回答錯誤的問題,請讓我知道)。

認爲你想要做的是:

SomeClass = function { 
    // some stuff that uses initRequest  
    this.initRequest = function() { 
     return request; 
    } 
} 

換句話說,你想用一個新的功能覆蓋原始SomeClass的對象。除非你這樣做,否則新的SomeClass對象不會使用你的測試方法,他們只會使用原始方法。

但是,如果您只想爲某個特定對象而不是整個類重寫該方法,那麼您應該有什麼工作。如果是這樣的話,你能否澄清一下究竟哪些方面沒有起作用?

-1

首先,此代碼示例不是JavaScript中OOP的最佳方式 - 使用prototype代替。另一種說法是,你的示例在我的瀏覽器中拋出錯誤(無效的SomeClass函數聲明,也許它只是輸入錯誤)。最後,instance.initRequest實際上會返回(我在Google Chrome中運行過它)對象 - 請檢查my sample

+0

我說什麼錯了? – ajukraine 2011-11-10 19:14:56

0
SomeClass.prototype.initRequest = function() 
    { 
    return request; 
    } 
相關問題