克隆 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 这样的运行时更好地优化您的代码,并且它与创建带有大括号 '{}'
的简单散列一样快
我有一个函数构造函数,它创建一个带有函数的对象,比如说,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 这样的运行时更好地优化您的代码,并且它与创建带有大括号 '{}'
的简单散列一样快