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

Javascript:使用添加的钩子重置对象定义(钩子构造)

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

    我试图用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调用。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Andy E    15 年前

    问题是这一行:

    oldObj.apply(oldObj, arguments);
    

    在您的代码中,您从未实际创建 oldObj -您正在创建的实例 newObj

    oldObj.apply(this, arguments);
    

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