详解JavaScript中基于原型prototype的继承特性.docxVIP

详解JavaScript中基于原型prototype的继承特性.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
详解JavaScript中基于原型prototype的继承特性   这篇文章主要介绍了详解JavaScript中基于原型prototype的继承特性,JavaScript中缺少类等面向对象的重要特性,因而谈到继承也显得十分古怪...需要的朋友可以参考下   JavaScript 中的继承比较奇葩,无法实现接口继承,只能依靠原型继承。   原型链   原型就是一个对象,通过构造函数创建出来的实例会有指针指向原型得到原型的属性和方法。这样,实例对象就带有构造函数的属性方法和原型的属性方法,然后将需要继承的构造函数的原型指向这个实例,即可拥有这个实例的所有属性方法实现继承。   看下面演示代码:   //声明超类,通过构造函数和原型添加有关属性和方法   function Super(){   ? this.property = true;   }   Super.prototype.getSuperValue = function() {   ? return this.property;   };   //声明子类的构造函数   function SubType() {   ? this.subproperty = false;   }   //将子类的原型指向超类的实例,得到超类的一切   SubType.prototype = new Super();   SubType.prototype.constructor = SubType;   SubType.prototype.getSubValue = function(){   ? return this.subproperty;   };   //由子类创建对象,测试是否继承超类方法和属性   var instance = new SubType();   console.log(instance.getSuperValue());   所有函数的默认原型都是 Object 的实例,因此默认原型都会包含一个内部指针,指向 Object.prototype。   使用 instanceof 和 isPrototypeOf 可以确定原型和实例的关系:   instance instanceof Object;   Object.prototype.isPrototypeOf(instance);   使用原型链的时候,需要谨慎的定义方法。子类需要重写超类型的某个方法或者扩充,一定要放在替换原型的语句后面,这样才能生效。此外,通过原型链实现继承时,不能使用对象字面量创建原型方法,这样会重写原型链:   ......   SubType.prototype = new Super();   SubType.prototype = {   ? ....   };   这会更换指针指向新对象,从而重写了原型链。   原型链的继承方法是有缺陷的,主要有两个问题:   1,来自包含引用类型值的原型,会被所有实例共享。   前面文章介绍过包含引用类型值的原型属性会被所有实例共享,一个实例修改,其他实例会随之改变,因此需要在构造函数中定义属性。而原型链继承的时候,无论超类中属性是在构造函数还是原型中定义,全部都变成了实例对象被子类继承,从而对子类的实例产生影响。   2,创建子类型的实例时,不能向超类型的构造函数中传递参数。   原型链的继承,直接将子类原型指向超类的实例,这时候可以向超类传递参数。但是当子类创建实例的时候,只能向子类的构造函数传递参数,而不能向超类的构造函数传递参数。   因此实际应用中,很少单独使用原型链。   相关的一些代码实践   鉴别一个原型属性   function hasPrototypeProperty(object, name) {   ? return name in object !object.hasOwnProperty(name);   }   在构造函数中使用原型对象   function Person(name) {   ? this.name = name;   }   Person.prototype = {   ? constructor: Person,   ? sayName: function () {   ? ? console.log(this.name);   ? },   ? toString: function() {   ? }   };   var person1 = new Person(Nicholas);   var person2 = new Person(Greg);   console.log(person1 instanceof Person); // true   console.log(pers

文档评论(0)

sanshengyuan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档