Как правильно получить AOP-подобный объект перед перехватом в Javascript? - PullRequest
0 голосов
/ 01 ноября 2010

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

Function.prototype.beforeConstruction = function(newFunc) {
    var oldObj = this;
    var newObj = function() {
        newFunc.apply(this, arguments);
        oldObj.apply(this, arguments);
    }
    newObj.prototype = oldObj.prototype;
    return newObj;
};

Используется так:

someObj = someObj.beforeConstruction(function() {
    //executed before someObj is constructed
});

Теперь проблема в том, что если объект имеет статические полякак это:

someObj.staticField = "example";

Они будут потеряны при возврате объекта к объекту с крючком.Копирование прототипа не помогает в этом.

Может кто-нибудь помочь мне здесь?Помните, что это должно работать без необходимости изменять существующие объекты (чтобы его можно было использовать для существующих библиотек).

С уважением, Том

1 Ответ

1 голос
/ 01 ноября 2010

не уверен, что это то, что вам нужно, но вы можете попробовать перебрать все свойства в оригинальном someObj и скопировать их значения в newObj.

Function.prototype.beforeConstruction = function(newFunc) {
    var oldObj = this;
    var newObj = function() {
        newFunc.apply(this, arguments);
        oldObj.apply(this, arguments);
    }

    // copy static fields here.
    for(var key in this) {
       // This will not copy static fields of any base classes.
       if(this.hasOwnProperty(key)) {
          newObj[key] = this[key];
       }
    }

    newObj.prototype = oldObj.prototype;
    return newObj;
};

У MozDev есть статья, объясняющая hasOwnProperty - https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

...