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

比较上面两个例子就知道了。

 

posted on 2017-06-26 17:29  人生如逆旅我亦是行人  阅读(317)  评论(0编辑  收藏  举报