-
29-09-2020 - |
题
JavaScript中的常见操作是用新的一个对象方法替换新的一个,同时仍称为原始方法。这通常是这样做的:
var originalMethod = obj.method;
obj.method = function(arg) {
// call original method
originalMethod.call(this, arg);
// do my stuff new stuff
}
.
我想创建一个特定对象方法的实用程序函数,处理链接部分,以便用户不需要关注它。一个选项是使用上述设计,其中每个添加的函数被包裹在一个调用前一个的新函数中。另一个选项是创建一个函数数组,并使对象方法刚刚迭代数组,依次调用每个函数。
function addXyzMethod1(fn) {
if (obj.method) {
var previousMethod = obj.method;
obj.method = function(value) {
value = previousMethod.call(this, value);
return fn.call(this, value);
};
} else {
obj.method = fn;
}
}
function addXyzMethod2(fn) {
if (obj._methodList) {
obj._methodList.push(fn);
} else if (obj.method) {
obj._methodList = [obj.method, fn];
obj.method = function(value) {
for (var i = 0, n = obj._methodList.length; i < n; i++) {
value = obj._methodList[i].call(this, value);
}
return value;
};
} else {
obj.method = fn;
}
}
.
此时,我无法决定以来我觉得每个人的权衡都是甚至的权衡。所以我的问题是:这些方法中的哪一个更好(更自然,或接受,或更快),或者是否有另一种方法可以改善这两种?
解决方案
这个问题非常相似,或者至少在这里归结为类似的问题: https://stackoverflow.com/questions/660337 < / a>
其他提示
What you are trying to do is a JavaScript version of call super, which is described as a code smell by Martin Fowler.
I would suggest instead that you either
- Contain the "super" object instead of inheriting from it.
Use template method, such as below
templateMethod = function () { baseMethod(); if (overrideMethod) { overrideMethod(); } };
Other objects would call templateMethod. The overrideMethod is where child objects would have their code.