克隆 javascript 函数

Clone javascript function

我有一个函数构造函数,它创建一个带有函数的对象,比如说,do_it:

function do_it_maker() {
     this.do_it = function() { /* do something */ };
     this.other_do = function() { /* do anything else */ };
}

我想为 do_it_maker 对象创建一个包装器,通过寄生继承来丰富 do_it 行为:

function do_it_maker_wrapper() {
     var do_it_obj = new do_it_maker();

     do_it_obj.do_it_original = do_it_obj.do_it;

     do_it_obj.do_it = function() {
         do_it_obj.do_it_original();
         /* smth_else */
     }

     return do_it_obj;
}

var do_it_obj = new do_it_maker_wrapper();
do_it_obj.do_it(); // Reimplemented version.
do_it_obj.other_do(); // Untouched.

我的问题是,do_it_obj.do_it() 调用会导致递归调用吗?或者对原始 do_it 函数的引用仍然存在?

我在 Whosebug 中找到了相关问题,但我读到了关于是否必须克隆该方法的矛盾答案。

那么,会发生什么呢?如果引用在更改 do_it 后变为递归,哪种克隆方法最容易理解且所需代码量最少?我是一个 C++ 和不喜欢只复制粘贴代码的人,一些 Javascript 功能对我来说仍然晦涩难懂(不过我并不笨拙,你可以稍微努力一点)。

会调用原函数,不会递归

function do_it_maker_wrapper() {
    var do_it_obj = new do_it_maker();

    // in this line you save/keep the reference to 'do_it' original function on a 
    // completely new reference.
    do_it_obj.do_it_original = do_it_obj.do_it;

    // this line replaces the reference to original 'do_it' with a reference to a
    // new function that we create here
    do_it_obj.do_it = function() {

         // this still references the original 'do_it' function so that is called
         do_it_obj.do_it_original();
         / * smth_else */
    }
}.

var do_it_obj = new do_it_maker_wrapper();

// this property references the function that we created as a replacement for the original 'do_it'
do_it_obj.do_it();

编辑: 随着 ES6 几乎无处不在,现在你不需要像那样跳来跳去,只需像在任何其他 OO 语言中一样使用 'class' 和 'extend'。它实际上甚至可以帮助像 v8 这样的运行时更好地优化您的代码,并且它与创建带有大括号 '{}'

的简单散列一样快