js的5种继承方式——前端面试

js主要有以下几种继承方式:对象冒充,call()方法,apply()方法,原型链继承以及混合方式。下面就每种方法就代码讲解具体的继承是怎么实现的。

1、继承第一种方式:对象冒充

 1 function Parent(username){
 2   this.username = username;
 3   this.hello = function(){
 4    alert(this.username);
 5   }
 6 }
 7 function Child(username,password){
 8   //通过以下3行实现将Parent的属性和方法追加到Child中,从而实现继承
 9   //第一步:this.method是作为一个临时的属性,并且指向Parent所指向的对象,
10   //第二步:执行this.method方法,即执行Parent所指向的对象函数
11   //第三步:销毁this.method属性,即此时Child就已经拥有了Parent的所有属性和方法 
12   this.method = Parent;
13   this.method(username);//最关键的一行
14   delete this.method;
15 this.password = password; 16 this.world = function(){ 17 alert(this.password); 18 } 19 } 20 var parent = new Parent("zhangsan"); 21 var child = new Child("lisi","123456"); 22 parent.hello(); 23 child.hello(); 24 child.world();

2、继承第二种方式:call()方法方式

call方法是Function类中的方法 
call方法的第一个参数的值赋值给类(即方法)中出现的this 
call方法的第二个参数开始依次赋值给类(即方法)所接受的参数

 1 function test(str){
 2   alert(this.name + " " + str);
 3 }
 4 var object = new Object();
 5 object.name = "zhangsan";
 6 test.call(object,"langsin");//此时,第一个参数值object传递给了test类(即方法)中出现的this,而第二个参数"langsin"则赋值给了test类(即方法)的str
 7 function Parent(username){
 8   this.username = username;
 9   this.hello = function(){
10    alert(this.username);
11   }
12 }
13 function Child(username,password){
14   Parent.call(this,username);
15   this.password = password;
16   this.world = function(){
17    alert(this.password);
18   }
19 }
20 var parent = new Parent("zhangsan");
21 var child = new Child("lisi","123456");
22 parent.hello();
23 child.hello();
24 child.world();
 1 function Parent(firstname)  
 2 {  
 3     this.fname=firstname;  
 4     this.age=40;  
 5     this.sayAge=function()  
 6     {  
 7         console.log(this.age);  
 8     }  
 9 }  
10 function Child(firstname)  
11 {  
12   
13     this.saySomeThing=function()  
14     {  
15         console.log(this.fname);  
16         this.sayAge();  
17     }  
18    this.getName=function()  
19    {  
20        return firstname;  
21    }  
22   
23 }  
24 var child=new Child("张");  
25 Parent.call(child,child.getName());  
26 child.saySomeThing();

3、继承的第三种方式:apply()方法方式

apply方法接受2个参数, 
A、第一个参数与call方法的第一个参数一样,即赋值给类(即方法)中出现的this 
B、第二个参数为数组类型,这个数组中的每个元素依次赋值给类(即方法)所接受的参数

 1 function Parent(username){ 
 2   this.username = username; 
 3   this.hello = function(){ 
 4    alert(this.username); 
 5   } 
 6 } 
 7 function Child(username,password){ 
 8   Parent.apply(this,new Array(username)); 
 9   this.password = password; 
10   this.world = function(){ 
11    alert(this.password); 
12   } 
13 } 
14 var parent = new Parent("zhangsan"); 
15 var child = new Child("lisi","123456"); 
16 parent.hello(); 
17 child.hello(); 
18 child.world();
 1 function Parent(firstname)  
 2 {  
 3     this.fname=firstname;  
 4     this.age=40;  
 5     this.sayAge=function()  
 6     {  
 7         console.log(this.age);  
 8     }  
 9 }  
10 function Child(firstname)  
11 {  
12   
13     this.saySomeThing=function()  
14     {  
15         console.log(this.fname);  
16         this.sayAge();  
17     }  
18     this.getName=function()  
19     {  
20         return firstname;  
21     }  
22   
23 }  
24 var child=new Child("张");  
25 Parent.apply(child,[child.getName()]);  
26 child.saySomeThing();

4、继承的第四种方式:原型链方式

实现原理是使子类原型对象指向父类的实例以实现继承,即重写类的原型,弊端是不能直接实现多继承

即子类通过prototype将所有在父类中通过prototype追加的属性和方法都追加到Child,从而实现了继承

 1 function Parent()  
 2 {  
 3   
 4     this.sayAge=function()  
 5     {  
 6         console.log(this.age);  
 7     }  
 8 }  
 9 function Child(firstname)  
10 {  
11     this.fname=firstname;  
12     this.age=40;  
13     this.saySomeThing=function()  
14     {  
15         console.log(this.fname);  
16         this.sayAge();  
17     }  
18 }  
19   
20 Child.prototype=new  Parent();  
21 var child=new Child("张");  
22 child.saySomeThing(); 
 1 function Person(){ 
 2 } 
 3 Person.prototype.hello = "hello"; 
 4 Person.prototype.sayHello = function(){ 
 5   alert(this.hello); 
 6 } 
 7 function Child(){ 
 8 } 
 9 Child.prototype = new Person();//这行的作用是:将Parent中将所有通过prototype追加的属性和方法都追加到Child,从而实现了继承 
10 Child.prototype.world = "world"; 
11 Child.prototype.sayWorld = function(){ 
12   alert(this.world); 
13 } 
14 var c = new Child(); 
15 c.sayHello(); 
16 c.sayWorld(); 

5、继承的第五种方式:混合方式

混合了call方式、原型链方式

function Parent()  
{  
  
    this.sayAge=function()  
    {  
        console.log(this.age);  
    }  
}  
  
Parent.prototype.sayParent=function()  
{  
   alert("this is parentmethod!!!");  
}  
  
function Child(firstname)  
{  
    Parent.call(this);  
    this.fname=firstname;  
    this.age=40;  
    this.saySomeThing=function()  
    {  
        console.log(this.fname);  
        this.sayAge();  
    }  
}  
  
Child.prototype=new  Parent();  
var child=new Child("张");  
child.saySomeThing();  
child.sayParent();  

 

posted @ 2017-01-11 15:13  张三的美丽家园  阅读(3965)  评论(0编辑  收藏  举报