JavaScript基于原型链的继承_javascript技巧_第1页
JavaScript基于原型链的继承_javascript技巧_第2页
JavaScript基于原型链的继承_javascript技巧_第3页
JavaScript基于原型链的继承_javascript技巧_第4页
JavaScript基于原型链的继承_javascript技巧_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、javascript基于原型链的继承javascript并不是一门面向对象的语言,没有提供传统的继承方式,但是它提 供了一种原型继承的方式,利用自身提供的原型属性来实现继承。原型链是javascript中继承的主要方法。原型链的基本思想是:利用原型让一个引用类型继乐另一个引用类型的属性和方 法。构造函数、原型和实例的关系:每个构造函数都有一个原型对彖,原型对象都包 含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。如果让原型对象等于另一个对象的实例,这样原型对象将包含一个指向另一个原 型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。实现原型链的基本模式:fu

2、nction supertype() perty = true;superttotype, getsupervalue = function () return this. proper、ty;;function subtype() this subproperty = false;/ 继承 supertypesubtype .prototype = new supertype();subttotype. getsubvalue = function () return thissubproperty;;var instance 二 new subt

3、ype ();alert (instanee. getsupervalueo) ; / truesubtypc继承了 supertype,继承是通过创建supertype的实例,并将该实例赋给 subtypc. prototype实现的。实现的木质是重写原型对象,换成一个新类型的实 例。这样,原来存在于supertype的实例屮的屈性和方法,也存在与subtype, prototype中了。然后给subtype, prototype添加一个方法,这样就继 承了 supertype的属性和方法的基础上又添加了一个方法。匕例中的实例关系表示如下:supertypeprototypesupertyp

4、e prototypeconstructorgetsupervalue(function)subtype prototypeprototypepropertytruegetsubvalue(function)instanceprototypesubpropertyfalsesubtypgprototype上面没有使用subtype默认提供的原型,而是给它换了一个新原型;这个新原型 就是supertype的实例。新原型内部述有一个执行supertype的原型的指针。结 果变成了 instance指向subtype的原型,subtype的原型乂指向supertype的 原型。getvalue ()

5、方法仍然还在 supertype, prototype 中,但 prototype 则位于 subtype, prototype 中。这是因为 property 是一个实例属性,而 getsupervalueo 则是一个原型方法。既然subtype, prototype现在是supertype的实例,那么 property自然位于该实例小。注意:instance, constructor现在指向的是supertype,因为subtype的原型指 向了另一个对彖 supertype的原型,这个原型对彖的constructor属性指向 的是 supertypeo当以读取模式访问一个属性时,首先会在

6、实例中搜索该属性。如果没冇找到该属 性。则会继续搜索实例的原型。通过原型链实现继承的情况f,搜索过程就得以 沿着原型链继续向上。默认的原型所有引用类型都默认继承了 object,而这个继承也是通过原型链实现的。所有 函数的默认原型都是object的实例。因此默认原型都会包含一个内部指针,指 向object, prototypco这就是为什么白定义类型都会继承tostring()、valucof () 等方法的原因。完整的原型链:subtypesubtype prototypeprototype |prototypepropertytruegetsubvalue(function)instanc

7、eprototypesubpropertyfalse在上面的继承体系中,subtype继承了 supertype, supertype继承了 object。 当调用了 instance. tostringo时,实际调用的是保存在object, prototype中 的那个方法。确定实例和原型的关系可以通过两种方式来确定原型和实例之间的关系:使用instanceof操作符alcrt (instance insteinccof objcct);alert (instance instanceof supertype);alert(instance instanceof subtype);由于原型链

8、的关系,上面全部返冋true。使用 isprototypeof 0 方法alert(object prototype. isprototypeof(instance); alert(supertype, prototype. isprototypeof (instance); alert (subttotype. isprototypeof(instance);谨慎定义方法给原型添加方法的代码一定要放在替换原型的语句之后。function supertype() this, property = true;superttotype. getsupervalue 二

9、function () return perty;function subtype() this, subproperty = false;supertype, prototype = new supertype ();/添加方法subtype, prototype. getsubvalue = function () return this, subproperty;/覆盖超类中的方法subtypc. prototype, gctsupcrvaluc 二 function () return false;var instanee 二 new subtype ();alert

10、(instance. getsupervalue(); / false上面的例子必须注意的是,在用supertype的实例替换原型z后,再定义那两个 方法。另外,在通过原型链实现继承时,不能使用该对象字面量创建原型方法。因为这 样做会重写原型链:function supertype() this, property = true;superttotype. getsupervalue 二 function () return perty;function subtype() this, subproperty = false;/ 继承 supertypesubty

11、pe, prototype = new supertype ();/使用字面量添加新方法,导致上一行代码无效subtype, prototype 二getsubvalue :function() rcturn this.subproperty;,someothermethod: function () return false;;var instanee = new subtype ();alert(instance getsupervalue (); / error上例将supertype的实例赋值给原型,紧接着又将原型替换成一个对象字面量而 导致的问题。现在的原型包含一个object的实例

12、,而非supertype的实例, subtype和supertype之间已经没有关系了。原型链的问题前面己经介绍过,包含引用类型值得原型属性会被所有实例共享;而这也正是为 什么要在构造函数屮,而不是在原型对象屮定义属性的原因。function supertype() this.colors = "red", "blue", "green"function subtype() subtypc. prototype = new supertype ();var instancel = new subtype();instancel. co

13、lors. push("black");alert(instancel.colors); / "red, "blue", green", "black"var instance2 = new subtype ();alert (instancc2 .colors); / "red", "blue", "green", "black"在上面的例子中,supertype构造函数中定义了一个colors属性,该属性包含 一个数组,supertype的毎个实例都会有各自包含自己数组的colors属性。当 subtype通过原型链继承了 supertype之后,subtype, prototype

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论