JavaScript: как переопределить открытый метод в каком-то классе? - PullRequest
1 голос
/ 18 ноября 2009

У меня есть такой класс 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.

Есть идеи, что случилось?

Ответы [ 5 ]

0 голосов
/ 07 марта 2013
SomeClass.prototype.initRequest = function() 
  {  
  return request;
  }  
0 голосов
/ 02 ноября 2011

Прежде всего, этот пример кода не лучший способ ООП в JavaScript - используйте вместо него prototype. Еще одно замечание: ваш пример выдает ошибку в моем браузере (недопустимое объявление функции SomeClass, возможно, это только ошибка ввода). И наконец, instance.initRequest фактически возвращает (я запускал его в Google Chrome) ожидаемый вами объект - проверьте, пожалуйста, мой образец .

0 голосов
/ 18 ноября 2009

В вашем первом примере initRequest возвращает новый объект после каждого вызова; во втором примере все вызовы initRequest возвращают ссылку на единственный объект (mock).

Объект запроса не изменяется в приведенном вами примере кода. instance.initRequest просто возвращает ссылку на запрос. Почему вы ожидаете, что он изменился?

0 голосов
/ 19 ноября 2009

У меня небольшие проблемы с пониманием вашего вопроса из-за вашего английского, но я все равно постараюсь ответить (и если я отвечу не на тот вопрос, просто дайте мне знать).

Я думаю , что вы хотите сделать, это:

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

Другими словами, вы хотите перезаписать исходный объект SomeClass новой функцией. Если вы не сделаете это, новые объекты SomeClass не будут использовать ваш тестовый метод, они просто будут использовать оригинальный метод.

Однако, если вы хотите переопределить этот метод только для определенного объекта, а не для всего класса, то, что у вас там должно работать. Если это так, не могли бы вы уточнить, что именно не работает?

0 голосов
/ 18 ноября 2009

Проверьте расширенную функциональность YUI. Это делает все это действительно чистым, ПЛЮС, вы все равно можете получить доступ к методу суперкласса, если действительно хотите. Их дополнительный объект также может быть интересен для вас.

Вот ссылка http://developer.yahoo.com/yui/examples/yahoo/yahoo_extend.html

...