克隆javascript函数

时间:2016-11-15 01:37:13

标签: javascript function clone

我有一个函数构造函数,它创建一个带有函数的对象,比如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函数的引用仍然存在?

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

那么,会发生什么?如果在更改do_it后引用变为递归,这是最容易理解的,并且需要克隆该方法所需的代码量最少?我是一个C ++而不是快乐的只是复制粘贴代码的人,而且一些Javascript功能看起来仍然模糊不清(虽然我不是很笨拙,你可以做得有点难度)。

1 个答案:

答案 0 :(得分:3)

它将调用原始函数,不会发生递归

ggplot(data = iris, aes(x = Sepal.Length,  y = Petal.Length)) +
  geom_point(aes(color = Species)) +
  geom_smooth(method = "nls", formula = y ~ a * x + b, se = F,
              method.args = list(start = list(a = 0.1, b = 0.1))) +
  facet_wrap(~ Species)

编辑: 现在几乎无处可用ES6,现在你不再需要像那样跳过篮球了,只需要使用' class'并且'延伸'就像你在任何其他OO语言中一样。它实际上甚至可以帮助像v8这样的运行时更好地优化你的代码,它就像用大括号创建一个简单的哈希一样快#39; {}'