簡體   English   中英

Javascript:如何在某些類中重寫公共方法?

[英]Javascript: how to override public method in some class?

我有這樣的JS類,必須進行測試:

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的函數。

任何想法有什么問題嗎?

SomeClass.prototype.initRequest = function() 
  {  
  return request;
  }  

查看YUI的擴展功能。 PLUS確實使這一切變得干凈,如果您確實願意,您仍然可以訪問超類的方法。 它們的增強對象也可能使您感興趣。

這是鏈接http://developer.yahoo.com/yui/examples/yahoo/yahoo_extend.html

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

您提供的代碼示例中未更改請求對象。 instance.initRequest簡單返回對請求的引用。 為什么期望它有所改變?

由於您的英語,我在理解您的問題時遇到了一些麻煩,但是無論如何我都會嘗試回答(如果我回答錯了,請告訴我)。

您想做的是:

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

換句話說,您想使用新函數覆蓋原始的SomeClass對象。 除非您這樣做,否則新的SomeClass對象不會使用您的測試方法,否則它們只會使用原始方法。

但是,如果您只想為特定對象而不是整個類覆蓋該方法,那么那里的內容應該起作用。 如果是這樣,您能否請您澄清究竟是什么在起作用?

首先,此代碼示例不是JavaScript中OOP的最佳方法-而是使用prototype 再次說明,您的示例在我的瀏覽器中引發錯誤( SomeClass函數的聲明無效,也許只是鍵入錯誤)。 最后, instance.initRequest實際上返回了您期望的對象(我已經在Google Chrome上運行了它)-請檢查我的示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM