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

时间:2010-11-03 20:28:20

标签: javascript debugging constructor hook aop

我正在尝试在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 个答案:

答案 0 :(得分:1)

问题是这一行:

oldObj.apply(oldObj, arguments);

在您的代码中,您实际上从未创建oldObj的实例 - 您正在创建newObj的实例。由于您在技术上用新构造函数替换旧构造函数,因此您需要将旧构造函数应用于替换的实例:

oldObj.apply(this, arguments);

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