Javascript: сброс определения объекта с добавленным хуком (конструкция хука)

Я пытаюсь подключить создание объектов в Javascript. Это легко для методов, но не для конструкторов. Я не могу изменить способ создания объектов, так как это должно работать для текущих библиотек.

Во всяком случае, это то, что я имею сейчас:

Function.prototype.afterConstruction = function(hookFunc) {
    var oldObj = this;
    var newObj = function() {
        oldObj.apply(oldObj, arguments);
        hookFunc.apply(oldObj, arguments);
    }
    newObj.prototype = oldObj.prototype; //copy prototype fields of oldObj
    for (var key in oldObj) { //copy static fields of oldObj
        if (oldObj.hasOwnProperty(key)) newObj[key] = oldObj[key];
    }
    return newObj;
};

Вот как это используется:

SomeObj = SomeObj.afterConstruction(function() {
   //executed after SomeObj construction
});

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

Эта проблема показана в следующем jsfiddle: http://www.jsfiddle.net/6rBTZ/1/< /а>

Если вы запустите его с firebug, он даст вам _thisInstance.onTextChange не является функцией из-за вызова afterConstruction ранее для этого объекта.

Любая помощь или улучшения в моем строительном крючке приветствуются.


person Tom    schedule 03.11.2010    source источник
comment
извините, но я считаю, что расширять прототип Function не очень хорошая идея. Я не копался в вашем коде, но вы, вероятно, проверили бы, есть ли другой способ достичь вашей цели.   -  person pex    schedule 03.11.2010
comment
Пожалуйста, уточните, есть ли другой способ добавления хуков к объектам без изменения этих объектов в исходном коде.   -  person Tom    schedule 03.11.2010


Ответы (1)


Проблема в этой строке здесь:

oldObj.apply(oldObj, arguments);

В вашем коде вы никогда не создаете экземпляр oldObj — вы создаете экземпляр newObj. Поскольку технически вы заменяете старый конструктор новым, вам необходимо применить старую функцию конструктора к экземпляру замены:

oldObj.apply(this, arguments);

http://www.jsfiddle.net/AndyE/6rBTZ/9/

person Andy E    schedule 04.11.2010