JS继承——原型链
程序员文章站
2022-05-23 12:15:36
许多OO语言支持两种继承:接口继承和实现继承。ECMAScript只支持实现继承,且继承实现主要依赖原型链实现。 原型链 基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法。 构造函数、原型和实例的关系:每个构造函数均有一个原型对象,原型对象均包含一个指向构造函数的指针,实例均包含一个指 ......
许多oo语言支持两种继承:接口继承和实现继承。ecmascript只支持实现继承,且继承实现主要依赖原型链实现。
原型链
基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法。
构造函数、原型和实例的关系:每个构造函数均有一个原型对象,原型对象均包含一个指向构造函数的指针,实例均包含一个指向原型对象的内部指针。若让原型对象等于另一个类型的实例,此时原型对象将包含一个指向 另一个原型的指针,相应地,另一个原型中也包含一个指向另一个构造函数的指针。若另一个原型又是另一个类型的实例,那么上述关系依然成立,如此层层递进,就构成了实例与原型的链条。
原型链基本模式,示例代码如下:
1 <!doctype html> 2 <html> 3 <head> 4 <title>原型链-继承</title> 5 <script type="text/javascript"> 6 function supertype(){ 7 this.property=true;//propertype属于supertype实例属性 8 } 9 10 supertype.prototype.getsupervalue=function(){//getsupervalue()属于原型方法 11 return this.property; 12 };//至此,supertype原型包含指向supertype构造函数的constructor属性和getsupervalue()方法。 13 14 function subtype(){ 15 this.subproperty=false;//subproperty属于subtype实例属性 16 } 17 18 //继承了supertype,重写了原型对象 19 subtype.prototype=new supertype(); 20 21 //添加新方法 22 subtype.prototype.getsubvalue=function(){//为subtype原型添加方法getsubvalue() 23 return this.subproperty; 24 }//至此,subtype原型模型中包含属性和方法为:内部属性[prototype]、property属性、getsupervalue()方法。作为一个supertype类型的实例,其内部属性[prototype]指向supertype原型,实例属性property。 25 26 //重写超类中的方法,因此需要谨慎地定义方法 27 subtype.prototype.getsupervalue=function(){ 28 return false; 29 } 30 31 var instance=new subtype();//实例内部属性[prototype]指向subtype原型;且包含实例属性subproperty 32 alert(instance.getsupervalue());//在重写超类函数之前返回true;重写了超累函数之后返回false 33 34 //确定原型和实例的关系 35 alert(instance instanceof object);//true 36 alert(instance instanceof supertype);//true 37 alert(instance instanceof subtype);//true 38 39 alert(object.prototype.isprototypeof(instance));//true 40 alert(supertype.prototype.isprototypeof(instance));//true 41 alert(subtype.prototype.isprototypeof(instance));//true 42 </script> 43 </head> 44 <body> 45 </body> 46 </html>
原型链的问题:
(1)原型链子类实例共享父类引用类型,同原型模型的问题一样。
(2)在创建子类的实例时,不能在不影响所有对象实例的情况下,向超类型的构造函数传递参数
因此,实践中很少单独使用原型链。
文章内容部分摘自《javascript高级程序设计(第3版)》
上一篇: 这是亲妈不?