标签:
javascript并不是纯粹的面向对象的语言,因此也没有明确的继承方式,但可以通过一些方式来模拟继承。本文总结常见的javascript继承模拟方式
1,对象继承
//父类 function Person(name,age){ this.name = name; this.age = age; }; Person.prototype.height = "170cm"; //子类 function Boy(){ this.speak = function(){ alert("我是子类"); }; }; //继承方式 Boy.prototype = new Person("XiaoMing","20"); //测试 var boy = new Boy(); boy.speak(); //我是子类 alert(boy.name); //XiaoMing alert(boy.age); //20 alert(boy.height); //170cm
该种方式的继承方法为将子类的原型对象设置为父类的实例对象
该方法的优点是既继承了父类的类属性,又继承了父类原型对象中的属性
缺点是创建子类对象时如果需要传递参数,则只能用父类来接收参数,不太灵活,语法上也不面向对象
2,类继承
//父类 function Person(name,age){ this.name = name; this.age = age; } Person.prototype.height = "170cm"; //子类与继承方式 function Boy(name,age){ Person.call(this,name,age); this.speak = function(){ alert("我是子类"); } } //测试 var boy = new Boy("XiaoMing","20"); boy.speak(); //我是子类 alert(boy.name); //XiaoMing alert(boy.age); //20 alert(boy.height); //undefined
这种继承实际上就是在子类函数中通过call调用父类函数
优点是创建子类时传递参数不需要传递给父类,比较灵活,缺点是只能继承父类的类属性,无法继承父类的原型对象里的属性
3,混合继承
//父类 function Person(name,age){ this.name = name; this.age = age; } Person.prototype.height = "170cm"; //子类及继承方式 function Boy(name,age){ Person.call(this,name,age); this.speak = function(){ alert("我是子类"); } } Boy.prototype = new Person(); //测试 var boy = new Boy("XiaoMing","20"); boy.speak(); //我是子类 alert(boy.name); //XiaoMing alert(boy.age); //20 alert(boy.height); //170cm
这种继承方式实际上是上两种方式的结合体,因此既有第二种方式的灵活,又有第一种方式的全面
Boy.prototype = new Person(); 这一句中没有传递参数,该句作用是继承父类的原型对象里的属性,而call方式是继承父类的类属性
标签:
原文地址:http://www.cnblogs.com/JTechER/p/4784190.html