代码之家  ›  专栏  ›  技术社区  ›  Tom

如何在Javascript中正确地构造钩子之前获得类似AOP的对象?

  •  0
  • Tom  · 技术社区  · 15 年前

    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 回复  |  直到 15 年前
        1
  •  1
  •   Shane Tomlinson    15 年前

    不确定这是否是您想要的,但是您可以尝试循环遍历原始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

    推荐文章