2012-10-10 68 views
0

我需要编辑函数,它位于构造函数内部。 实施例:如何在JavaScript中修改构造函数中的函数?

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

但功能应该被编辑不单单只针对单个对象(new obj = some.thing();),但奥斯陆用于通过此构造任何创建的对象。

那么有什么方法可以编辑这样的内部函数吗?

感谢

+1

为什么里面的功能构造函数,而不是在构造函数的'.prototype'上?它是否需要构造函数中的变量访问? –

+1

不......你只能为每个新创建的实例覆盖'obj.somefn'。 –

+0

@FelixKling除非OP控制声明并且可以使其成为原型的属性... –

回答

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" 
+0

是的!其作品!看起来非常快。谢谢! –

+0

不错。看看这些调整,你可以保持'Old'免受污染,并避免用'new'调用它:http://jsfiddle.net/V6zve/ –

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

现在你得到的原始构造函数和原型链的利益,但你正在将自己的功能注入到o中被创建的对象。

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

在调用你之前,可能会保留和调用你重写的原始方法。不知道这种情况是否需要这样做。

+0

不幸的是,它不起作用,我得到了铬'RangeError:超过最大调用堆栈大小'错误和功能仍然相同 –

+0

@NikitaGavrilov:然后你做了一些不同的事情。这是一个演示。 http://jsfiddle.net/xzW9Z/确保你的新构造函数调用原来的,而不是自己。 –

+0

难道是因为重构造函数而导致错误? –

0

我完全知道你的需要,因为上周我通过它。我只是在javascript中实现了一个完整的继承模型,并且据我所知,我在重载构造函数时遇到问题,并在子类初始化时调用父类的ctor。

所以我刚刚解决了这个问题,修改了我的设计中的一些要点,现在它像一个魅力一样工作! (类似于C#,但使用Javascript)

顺便说一句,我不建议你用这种方式改变方法内容,但是这里有一个方法可以做到这一点(我自己并没有这样做,而AGIAIN I不建议这样做还有很多其他的方法,但是这是最简单):

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

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

test(); 

newTest(); 

干杯

相关问题