Tôi đã đọc Secrets of the JavaScript Ninja và tôi thấy mã này trong đó sản xuất một chức năng quá tải:JavaScript và chức năng quá tải làm rõ
function addMethod(object, name, fn)
{
var old = object[name];
object[name] = function()
{
if(fn.length == arguments.length) return fn.apply(this, arguments)
else if(typeof old == 'function') return old.apply(this, arguments);
};
}
function Ninjas()
{
var ninjas = ["Dean Edwards", "Sam Stephenson", "Alex Russell"];
// addMethod is defined in Listing 2-28
addMethod(this, "find", function()
{
return ninjas;
});
addMethod(this, "find", function (name)
{
var ret = [];
for(var i = 0; i < ninjas.length; i++)
if(ninjas[i].indexOf(name) == 0) ret.push(ninjas[i]);
return ret;
});
addMethod(this, "find", function (first, last)
{
var ret = [];
for(var i = 0; i < ninjas.length; i++)
if(ninjas[i] == (first + " " + last)) ret.push(ninjas[i]);
return ret;
});
}
var ninjas = new Ninjas();
assert(ninjas.find().length == 3, "Finds all ninjas");
assert(ninjas.find("Sam").length == 1, "Finds ninjas by first name");
assert(ninjas.find("Dean", "Edwards").length == 1, "Finds ninjas by first and last name");
assert(ninjas.find("Alex", "X", "Russell") == null, "Does nothing");
function assert(a,b)
{
if (a==true) console.log(b) ; else console("----");
}
Theo như tôi hiểu, các addMethod
luôn mang theo các giá trị old
của hàm (thông qua việc đóng cửa) .
Vì vậy, cuối cùng, có một chức năng mà kiểm tra một điều kiện, và nếu nó không thành công, nó viện dẫn old
chức năng mà lần lượt làm điều tương tự.
Tuy nhiên tôi không hiểu đánh giá của arguments.length
(Tôi biết sự khác biệt giữa function().length
và argument.length
).
Hình chữ nhật nào arguments
tham chiếu đến?
tôi theo dõi nó trong trình gỡ lỗi, và tôi bị nhầm lẫn bởi vì lúc đầu, các thanh ghi chức năng (để arguments.length
là 3 [(object, name, fn)]
, nhưng sau đó nó được gọi như vậy bây giờ có những lập luận khác.
thế nào là làm việc đối số
Các [MDN tài liệu trên 'arguments'] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments) có thể hỗ trợ. –