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

如何在JavaScript中更改构造函数内部的函数?,javascript,constructor,Javascript,Constructor,我需要编辑位于构造函数内部的函数。 例如: 但是,不仅要为单个对象(newobj=some.thing();)编辑函数,还要为该构造函数创建的任何对象编辑函数 那么有没有办法编辑这些内部函数呢?解决方案似乎有点太明显了,所以我想知道问题是您没有访问原始代码的权限,并且您需要一个更动态的解决方案 如果是这样,一个选项可能是用您自己的构造函数重写构造函数,让它调用原始构造函数,然后更新对象 原始代码: 您的代码: 现在您获得了原始构造函数和原型链的好处,但是您正在将自己的函数注入正在创建的对象中

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

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


那么有没有办法编辑这些内部函数呢?

解决方案似乎有点太明显了,所以我想知道问题是您没有访问原始代码的权限,并且您需要一个更动态的解决方案

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


原始代码:


您的代码:

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

唯一的问题可能是您替换的原始函数可能会特别使用原始构造函数的变量范围。如果是这样的话,就有一个问题需要解决


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

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

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


原始代码:


您的代码:

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

唯一的问题可能是您替换的原始函数可能会特别使用原始构造函数的变量范围。如果是这样的话,就有一个问题需要解决


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

我确切地知道你的需要,因为上周我通过了它。我刚刚用javascript实现了一个完整的继承模型,据我记忆所及,在初始化子类时,我遇到了重写构造函数和调用父类的构造函数的问题

所以我只是通过修改我的设计中的一些点来解决问题,现在它就像一个魅力!(类似于C#但使用Javascript)

顺便说一下,我不建议您以这种方式更改方法内容,但这里有一种方法可以做到这一点(我自己没有这样做,我也不推荐这样做。还有许多其他方法,但这是最简单的):


干杯

我完全知道你的需要,因为上周我就通过了。我刚刚用javascript实现了一个完整的继承模型,据我记忆所及,在初始化子类时,我遇到了重写构造函数和调用父类的构造函数的问题

所以我只是通过修改我的设计中的一些点来解决问题,现在它就像一个魅力!(类似于C#但使用Javascript)

顺便说一下,我不建议您以这种方式更改方法内容,但这里有一种方法可以做到这一点(我自己没有这样做,我也不推荐这样做。还有许多其他方法,但这是最简单的):


干杯

这里有一个基于原型的解决方案:

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"

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

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"


为什么函数在构造函数中,而不是在构造函数的
.prototype
上?它是否需要构造函数中的变量访问权限?否。。。您所能做的就是为每个新创建的实例覆盖
obj.somefn
。@FelixKling除非OP控制声明并将其作为原型的属性…user1689607,否则我无法使用.prototype…@NikitaGavrilov访问此函数,因为它不是原型的成员。如果是的话,你就一切就绪了。为什么函数在构造函数中,而不是在构造函数的
.prototype
上?它是否需要构造函数中的变量访问权限?否。。。您所能做的就是为每个新创建的实例覆盖
obj.somefn
。@FelixKling除非OP控制声明并将其作为原型的属性…user1689607,否则我无法使用.prototype…@NikitaGavrilov访问此函数,因为它不是原型的成员。不幸的是,它不起作用,我在Chrome
RangeError中遇到了一个错误:超过了最大调用堆栈大小,函数仍然有效same@NikitaGavrilov当前位置然后你做了一些不同的事情。这是一个演示。确保你的新构造函数调用的是原始构造函数,而不是它本身。可能是因为构造函数太重而导致我出错了吗?@NikitaGavrilov:不太可能。这个答案实际上与另一个答案相同。(不管怎么说,现在是这样,因为其中一个添加了
Old.apply(this);
来像我一样调用原始构造函数。)起初我确实在代码中有一个错误,但我在发布答案大约2分钟后更正了它。不幸的是,它不起作用,我在Chrome
RangeError中遇到了一个错误:超过了最大调用堆栈大小,并且函数仍然有效same@NikitaGavrilov当前位置然后你做了一些不同的事情。这是一个演示。确保你的新构造函数调用的是原始构造函数,而不是它本身。可能是因为构造函数太重而导致我出错了吗?@NikitaGavrilov:不太可能。这个答案实际上与另一个答案相同。(不管怎样,现在是这样,因为它添加了
Old.apply(this);
来像我一样调用原始构造函数。)起初我确实在代码中有一个错误,但我在发布答案大约2分钟后更正了它。很好。查看这些调整,您可以防止
旧的
污染,并避免使用
新的
:Nice调用它。看看这些调整,
       // 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();
var test = function() { /*InjectionPlace*/ };

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

test();

newTest();
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"