我需要编辑位于构造函数内部的函数。例子:
some.thing = function() {
this.somefn = function() { // this is the function that I need to fix
...
}
}
但是函数不仅应该被编辑为单个对象(new obj = some.thing();
),而且应该被这个构造函数创建的任何对象所编辑。
那么有没有办法编辑这样的内部功能呢?
我需要编辑位于构造函数内部的函数。例子:
some.thing = function() {
this.somefn = function() { // this is the function that I need to fix
...
}
}
但是函数不仅应该被编辑为单个对象(new obj = some.thing();
),而且应该被这个构造函数创建的任何对象所编辑。
那么有没有办法编辑这样的内部功能呢?
解决方案似乎有点太明显了,所以我想知道问题是否在于您无法访问原始代码,并且您需要一个更动态的解决方案。
如果是这样,一种选择可能是用您自己的构造函数覆盖构造函数,并让它调用原始构造函数,然后更新对象。
原始代码:
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();
现在你得到了原始构造函数和原型链的好处,但是你将自己的函数注入到正在创建的对象上。
唯一的麻烦可能是您替换的原始函数可能会特殊使用原始构造函数的变量范围。如果是这样,那将是一个需要解决的问题。
在调用您的方法之前,可以保留并调用您覆盖的原始方法。不确定这种情况是否需要。
这是一个基于原型的解决方案:
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"
我完全知道你的需要,因为上周我通过了它。我刚刚在 javascript 中实现了一个完整的继承模型,据我所知,在子类初始化时,我遇到了重写构造函数和调用父类的 ctor 的问题。
所以我只是通过修改我的设计中的一些点解决了这个问题,它现在就像一个魅力!(类似于 C#,但在 Javascript 中)
顺便说一句,我不建议您以这种方式更改方法内容,但这是一种方法(我自己没有这样做,我也不建议这样做。还有很多其他方法,但是这是最简单的):
var test = function() { /*InjectionPlace*/ };
eval("var newTest = " + test.toString().replace(
"/*InjectionPlace*/",
"var i = 10; alert(i);"
));
test();
newTest();
干杯