如何在JavaScript中更改构造函数内的函数?

时间:2012-10-10 18:48:41

标签: javascript constructor

我需要编辑位于构造函数内部的函数。 例如:

some.thing = function() {
    this.somefn = function() { // this is the function that I need to fix
        ...
    }
}

但是,不仅要为单个对象(new obj = some.thing();)编辑函数,还要为此构造函数创建的任何对象编辑函数。

那么有没有办法编辑这样的内部函数?

由于

3 个答案:

答案 0 :(得分:2)

解决方案似乎有点太明显了,所以我想知道问题是你是否无法访问原始代码,而且需要更加动态的解决方案。

如果是这样,一个选项可能用你自己的构造函数覆盖构造函数,让它调用原始函数,然后更新对象。


原始代码:

some.thing = function() {
    this.somefn = function() { // this is the function that I need to fix
        ...
    }
}

您的代码:

       // cache a reference to the original constructor
var _thing = some.thing;

               // your constructor
some.thing = function() {

             // invoke the original constructor on the new object.
    _thing.apply(this, arguments);

    this.somefn = function() { /*your updated function*/ };
};

        // maintain inheritance
some.thing.prototype = Object.create(some.thing.prototype);

  // make an instance
var theThing = new some.thing();

现在你已经获得了原始构造函数和原型链的好处,但是你将自己的函数注入到正在创建的对象中。

唯一的麻烦可能是你替换的原始函数可能会特别使用原始构造函数的变量作用域。如果是这种情况,则需要解决一个问题。

在调用你的方法之前,可以保留并调用你覆盖的原始方法。不确定这种情况是否需要这样做。

答案 1 :(得分:2)

以下是基于原型的解决方案:

var Something = function () {
    this.f = function () {
       console.log("Something");
    };    
};
var Old = Something;
var Something = function () {
    Old.apply(this);
    this.f = function () {
        console.log("New");
    };
};
Something.prototype = new Old();

var s = new Something();
s.f(); // prints "New"

答案 2 :(得分:0)

我确切地知道你上周需要的原因我通过了它。我刚刚在javascript中实现了一个完整的继承模型,据我所知,我在覆盖构造函数时遇到了问题,并在子类初始化时调用了父类的ctor。

所以我刚刚解决了问题,修改了我的设计中的一些要点,现在它就像一个魅力! (像C#,但在Javascript中)

顺便说一句,我建议你不要这样改变一个方法内容,但这是一种方法(我自己也不是这样做的,AGIAIN我不推荐它。还有很多其他的方式,但这是最轻松的):

var test = function() { /*InjectionPlace*/ };

eval("var newTest = " + test.toString().replace(
     "/*InjectionPlace*/", 
     "var i = 10; alert(i);"
));

test();

newTest();

干杯