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

如何在Javascript中正确构建钩子之前获得类似AOP的对象?,javascript,object,constructor,hook,aop,Javascript,Object,Constructor,Hook,Aop,我试图动态地改变Javascript中的所有对象,以便它的构造能够被钩住。这就是我现在得到的,几乎可以正常工作: Function.prototype.beforeConstruction = function(newFunc) { var oldObj = this; var newObj = function() { newFunc.apply(this, arguments); oldObj.apply(this, arguments);

我试图动态地改变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";
现在的问题是,如果对象具有如下静态字段:

someObj = someObj.beforeConstruction(function() {
    //executed before someObj is constructed
});
someObj.staticField = "example";
当将对象重置为带有挂钩的对象时,这些将丢失。复制原型对此没有帮助

有人能帮我吗?请记住,这必须在不需要修改现有对象的情况下工作(以便可以将其用于现有库)

问候,,
Tom

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

您认为这是施工前让吊钩工作的最有效方法吗?