JavaScript call,apply和prototype的介绍,区别
----这三个概念会在实现js继承中使用到
1.call和apply
call和apply的作用基本类似,都是去执行function并将这个function的context替换成第一个参数带入。两者的不同是call必须将function的参数一一带入,而apply只要在第二个参数带入一个数列。
1 function fn(arg1,arg2,arg3,...){ 2 //do something 3 } 4 5 fn(arg1,arg2,...); 6 7 fn.call(context,arg1,arg2,...); 8 9 fn.apply(context,[arg1,arg2,...]);
call方法调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[arg1[,arg2[,...[,argN]]]]])
参数:thisObj可选,用作当前对象的对象;arg1,arg2,...argN可选,将被传递方法参数序列。
如果没有提供thisObj,那么Global对象将被用作thisObj。
var func=new function(){this.a="func"}; var newfunc=function(x){ var a="newfunc"; console.info(this.a); console.info(x); }; newfunc.call(func,"hello world");//output:func hello world
2.prototype
JavaScript没有子类和父类的概念,靠原型链(prototype chain)模式来实现继承。
prototype是构造函数的一个属性。
所有实例对象需要共享的属性和方法,都放在这个prototype对象里面;那些不需要共享的属性放在构造函数里。
实例对象一旦创建,将自动引用prototype对象的属性和方法。实例对象的属性和方法分两种,一种是共享的,另一种是本地自己的。
1 //example 1 2 function Person(name){ 3 this.name=name; 4 } 5 6 var person1=new Person('Mike'); 7 var person2=new Person('Linda'); 8 person2.gender='female'; 9 console.info(person1.gender);//undefinded 10 console.info(person2.gender);//female 11
12 //example 2 13 function Person(name){ 14 this.name=name; 15 } 16 17 Person.prototype.gender='male'; 18 var person1=new Person('Mike'); 19 var person2=new Person('Linda'); 20 person2.gender='female'; 21 console.info(person1.gender);//male 22 console.info(person2.gender);//female
比较上面两个例子就知道了。