我有一个函数构造函数,它创建一个带有函数的对象,比如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功能看起来仍然模糊不清(虽然我不是很笨拙,你可以做得有点难度)。
答案 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; {}'