JS中的继承操作实例总结
本文实例讲述了JS中的继承操作。分享给大家供大家参考,具体如下:
1.原型链继承
functionSuperType(){ this.property=true; } SuperType.prototype.getSuperValue=function(){ returnthis.property; } functionSubType(){ ths.subproperty=false; } SubType.prototype=newSuperType();//实现继承 SubType.prototype.getSubValue=function(){ returnthis.subproperty; } varinstance=newSubType(); console.log(instance.getSuperValue());//true
原理:让SuperType的实例成为子类的原型对象,子类的实例拥有了父类的属性和方法。但也有弊端,如果父类的属性是引用类型,这将导致共享的属性被改变的时候,全部的属性将被改变,我们一下代码。
functionSuperType(){ this.property=[1,2,3]; } SuperType.prototype.getSuperValue=function(){ returnthis.property; } functionSubType(){ ths.subproperty=false; } SubType.prototype=newSuperType();//实现继承 SubType.prototype.getSubValue=function(){ returnthis.subproperty; } varinstance1=newSubType(); varinstance2=newSubType(); instance1.property.push(4); console.log(instance1.property);//[1,2,3,4] console.log(instance2.property);//[1,2,3,4]
我们修改一处的实例属性,两个实例的属性都会被修改,因为这个属性是共享的,这也是原型链继承的缺点。
2.构造函数继承
functionSuperType(name){ this.name=name; this.numbers=[1,2,3]; } functionSubType(){ SuperType.call(this,"Nicholas"); this.age=29; } varinstance1=newSubType(); varinstance2=newSubType(); instance1.property.push(4); console.log(instance1.name);//Nicholas console.log(instance1.age);//29 console.log(instance1.numbers);//[1,2,3,4] console.log(instance2.numbers);//[1,2,3]
在子类中调用父类的构造函数,每次实例化时都会新建父类的属性放在新实例中,因此每个实例中的属性都是不一样的,改变一个实例的值不会造成另一个实例的值改变。这个继承方式的缺点是方法的定义不能复用。
3.组合继承
这个方法将原型链继承和构造函数继承结合到一起,融合了他们各自的优点。
functionSuperType(name){ this.name=name; this.colors=["red","blue","green"] } SuperType.prototype.sayName=function(){ console.log(this.name); } functionSubType(name,age){ SuperType.call(this,name); this.age=age; } SubType.prototype=newSuperType(); SubType.prototype.constructor=SubType; SubType.prototype.sayAge=function(){ console.log(this.age); } varinstance1=newSubType("Nicholas",29); varinstance2=newSubType("Greg",27); instance1.colors.push("black"); console.log(instance1.colors);//red,blue,green,black console.log(instance2.colors);//red,blue,green instance1.sayName();//Nicholas instance2.sayName();//Greg instance1.sayAge();//29 instance2.sayAge();//27
4.class继承
ES6中可以通过class创建对象,通过关键字extends继承。
classPoint{ constructor(x,y){ this.x=x; this.y=y; } } classColorPointextendsPoint{ constructor(x,y,color){ this.color=color;//ReferenceError super(x,y); this.color=color;//正确 } }
在ES6的继承中,子类一定要重写父类的构造函授的方法,否则会报错。
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。