Как мне обезьяна исправить патч конструктора объекта? - PullRequest
9 голосов
/ 16 декабря 2011

Я бы хотел, чтобы обезьяна исправила конструктор для этого объекта 'Controller'.Но как мне сделать исправление функции конструктора, чтобы я мог вызвать оригинал?Это то, что я пробовал.

// original
function Controller() {
    this._tag = 'div';
}
Controller.prototype.tag = function() {
    console.log(this._tag);
}

var c = new Controller(); 
c.tag(); // -> 'div', as expected


// patch attempt
var original = Controller;
Controller = function() {
    original.apply(this);
    this._tag = 'patched'; // patch
}

var c = new Controller();
c.tag(); // no method tag, prototype appears wiped...

Ответы [ 2 ]

8 голосов
/ 17 декабря 2011

Вы, кажется, хотите сделать что-то вроде:

Constructor.prototype.oldTag = Constructor.prototype.tag;

Constructor.prototype.tag = function() {/* whatever */};

Теперь все экземпляры получают новый метод tag , и вы все равно можете вызвать oldTag , если хотите (или вернуть его).

Или, может быть, вы хотите сделать что-то вроде:

var oldConstructor = Constructor;

 var Constructor = function () { /* new constructor */ };
 Constructor.prototype = oldConstructor.prototype;

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

2 голосов
/ 16 декабря 2011

Более чистый способ - это не патча для обезьяны конструктора: поместите логику конструктора в отдельный метод init и вместо этого используйте патчи / наследование обезьяны.

function Constructor(){
    this.init();
}
Constructor.prototype.init = function(){ /*...*/ };

Вы также можете рассмотреть возможность создания объектов с помощью компоновщика.функция

function make_fancy_obj(){
    var obj = new Constructor();
    obj.foo = 'bar';
    return obj;
}
...