Как заменить метод без потери оригинала? - PullRequest
2 голосов
/ 29 июня 2009

Я заменяю (переопределяю, улучшаю, добавляю функциональность) метод в прототипе объекта Date. Вот упрощенная версия того, что я сделал:

Date.prototype._toString = Date.prototype.toString;

Date.prototype.toString = function(mask) {
    if(mask == undefined){return this._toString();}
    //snip
    //...
    //snip
    return date_string;
}

Поскольку я не хочу терять стандартный метод, я назначаю исходный метод временной переменной и при необходимости вызываю его.

Есть ли способ сделать это, не загрязняя пространство имен Date.prototype?

Я спрашиваю, этот же вопрос , только в Javascript.

Ответы [ 2 ]

7 голосов
/ 29 июня 2009

Вы можете сделать это так: -

(function() {
    var _toString = Date.prototype.toString;
    Date.prototype.toString = function(mask) {
       if (mask == undefined) { return _toString.call(this); }
    //snip
    }
 })();
1 голос
/ 29 июня 2009

Хотя вышеприведенное решение более элегантно, так как оно не загрязняет прототип Date.pro, вызовы «нового» toString будут замедлены из-за замыкания, которое оно включает.

С точки зрения скорости, вам будет лучше, чем вы упомянули в своем вопросе. Попробуйте цикл, который вызывает ваш код 20 000 раз, а затем попробуйте код, представленный Энтони.

В зависимости от того, как часто вызывается ваш код, вы можете пойти тем или иным путем.

Ура!

Обновление: вы можете прочитать этот маленький образец из Google

...