![](/img/trans.png)
[英]javascript: How to override a method for all the instances of some class?
[英]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.