gpt4 book ai didi

javascript - 难以理解函数重载

转载 作者:行者123 更新时间:2023-11-29 18:15:28 27 4
gpt4 key购买 nike

我很难理解“Javascript Ninja 的 secret ”一书中的这个例子。

概念是你有一个 addMethod 函数,它允许你将同一方法的多个版本传递给一个对象,区别在于这些方法接受的参数数量,以及它们处理这些参数的内容。

我不明白这背后的“机制”。在检查器中,我只看到第一种方法,但不知何故,当我使用不同的参数运行 find 方法时,它仍然设法使用它的适当变体。但是怎么办?使用三个版本运行 addMethod 后,这些方法如何仍然可用?你能帮我理解一下吗?

将方法绑定(bind)到对象的函数:

addMethod = function(object, name, fn) {
var old;
old = object[name];
return object[name] = function() {
if (fn.length === arguments.length) {
return fn.apply(this, arguments);
} else if (typeof old === 'function') {
return old.apply(this, arguments);
}
};
};

然后您可以像这样为对象的属性分配相同的函数名称:

addMethod(ninjas, 'find', function() {
return this.values;
});

addMethod(ninjas, 'find', function(name) {
var ninja, _i, _len, _ref, _results;
_ref = this.values;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
ninja = _ref[_i];
if (ninja.indexOf(name) !== -1) {
_results.push(ninja);
}
}
return _results;
});

addMethod(ninjas, 'find', function(first, last) {
var ninja, _i, _len, _ref, _results;
_ref = this.values;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
ninja = _ref[_i];
if (ninja === ("" + first + " " + last)) {
_results.push(ninja);
}
}
return _results;
});

最佳答案

每次重载一个函数时,它都会采用旧函数并将其替换为检查要使用哪个重载的函数。

添加第一个函数后,您的代码(大致)与以下内容相同:

ninjas.find = function(){
if (arguments.length === 1) {
// code for first overload
}
}

添加第二个函数后,您的代码与以下内容相同:

ninjas.find = function(){
if (arguments.length === 2) {
// code for second overload
} else {

if (arguments.lenght === 1) {
// code for first overload
}

}
}

每次添加另一个重载时,都会在之前的代码周围添加另一级别的检查。

关于javascript - 难以理解函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23713193/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com