मैं Secrets of the JavaScript Ninja पढ़ रहा था और मैं इस कोड है जो एक समारोह अधिभार का उत्पादन देखा:जावास्क्रिप्ट और समारोह अधिभार स्पष्टीकरण
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("----");
}
जहां तक मैं समझता हूँ, addMethod
हमेशा समारोह के old
मूल्य (बंद) के माध्यम से रहता है ।
तो अंत में, वहाँ एक समारोह जो एक शर्त है की जांच करता है, और अगर यह विफल रहता है, यह old
समारोह है जो बदले में एक ही बात करता invokes।
हालांकि मुझे arguments.length
के मूल्यांकन को समझ में नहीं आता है (मुझे function().length
और argument.length
के बीच अंतर पता है)।
कौन सा आयत arguments
का संदर्भ है?
मैं डीबगर में यह पता लगाया है, और मैं उलझन में हो रही है, क्योंकि पहली बार में, समारोह रजिस्टरों (ताकि है, लेकिन बाद में यह शुरू हो जाती है तो अब एक और तर्क हैं।
कैसे है कि काम कर रहे
[पर 'arguments' MDN डॉक्स] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments) सहायता के हो सकता है। –