【问题标题】:Javascript: resetting object definition with hook added (hooking construction)Javascript:使用添加的钩子重置对象定义(钩子构造)
【发布时间】:2010-11-04 21:19:24
【问题描述】:

我正在尝试在 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 is not a function,因为之前在这个对象上调用了 afterConstruction。

感谢任何对我的施工挂钩的帮助或改进。

【问题讨论】:

  • 抱歉,但我认为扩展Function 原型并不是一个好主意。我没有深入研究您的代码,但您可能会检查是否有其他方法可以实现您的目标。
  • 如果有另一种方法可以在不修改源代码中的对象的情况下向对象添加挂钩,请详细说明。

标签: javascript debugging constructor hook aop


【解决方案1】:

问题出在这一行:

oldObj.apply(oldObj, arguments);

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

oldObj.apply(this, arguments);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2020-08-27
    • 2022-01-15
    • 2020-12-05
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多