摘要:[JavaScript] Learning Advanced JavaScript 筆記
Learning Advanced JavaScript,作者:John Resig,很棒的教學文章!順手記些自己做的實驗程式碼…在 firebug的主控台執行。
//#2: Goal: To be able to understand this function:
Function.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift();
return function(){
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};
//my test note
var a=[1,2,3];
var b=[4,5,6];
console.log('concat, ',a.concat(b))
console.log(a)
console.log('pop, ',a.pop())
console.log(a)
console.log('shift, ',a.shift())
console.log(a)
console.log('slice, ', Array.prototype.slice.call(b,1))
console.log(b)
console.log('splice, ', Array.prototype.splice.call(b,1))
console.log(b)
/* result
concat, [1, 2, 3, 4, 5, 6]
[1, 2, 3]
pop, 3
[1, 2]
shift, 1
[2]
slice, [5, 6]
[4, 5, 6]
splice, [5, 6]
[4]
*/
//#90: How method overloading might work, using the function length property.
function addMethod(object, name, fn){
// Save a reference to the old method
var old = object[ name ];
// Overwrite the method with our new one
object[ name ] = function(){
// Check the number of incoming arguments,
// compared to our overloaded function
if ( fn.length == arguments.length )
// If there was a match, run the function
return fn.apply( this, arguments );
// Otherwise, fallback to the old method
else if ( typeof old === "function" )
return old.apply( this, arguments );
};
}
function Ninjas(){
var ninjas = [ "Dean Edwards", "Sam Stephenson", "Alex Russell" ];
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" );
//my test note
function addMethod(object, name, fn){
// Save a reference to the old method
var old = object[ name ];
console.log(old,arguments.length,',',fn.length)
// Overwrite the method with our new one
object[ name ] = function(){
console.log(arguments.length,',',fn.length)
// Check the number of incoming arguments,
// compared to our overloaded function
if ( fn.length == arguments.length )
// If there was a match, run the function
return fn.apply( this, arguments );
// Otherwise, fallback to the old method
else if ( typeof old === "function" )
return old.apply( this, arguments );//closure
};
}
function Ninjas(){
var ninjas = [ "Dean Edwards", "Sam Stephenson", "Alex Russell" ];
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();
console.log(ninjas)
console.log( ninjas.find().length == 3, 'ninjas.find() Finds all ninjas' );
console.log( ninjas.find("Sam").length == 1, 'ninjas.find("Sam") Finds ninjas by first name' );
console.log( ninjas.find("Dean", "Edwards").length == 1, 'ninjas.find("Dean", "Edwards") Finds ninjas by first and last name' );
console.log( ninjas.find("Alex", "X", "Russell") == null, 'ninjas.find("Alex", "X", "Russell") Does nothing' );
/* result
undefined 3 , 0
function() 3 , 1
function() 3 , 2
Object
0 , 2
0 , 1
0 , 0
true ninjas.find() Finds all ninjas
1 , 2
1 , 1
true ninjas.find("Sam") Finds ninjas by first name
2 , 2
true ninjas.find("Dean", "Edwards") Finds ninjas by first and last name
3 , 2
3 , 1
3 , 0
true ninjas.find("Alex", "X", "Russell") Does nothing
*/