首先来讨论一下原型链,上代码

 1 function SuperType(){
 2     this.property = true;
 3   }
 4
 5   SuperType.prototype.getSuperValue = function(){
 6     console.log(this.property);
 7   }
 8
 9   function SubType(){
10     this.subproperty = false;
11   }
12
13   SubType.prototype = new SuperType();
14
15   SubType.prototype.getSubValue = function(){
16     console.log(this.subproperty);
17   }
18
19   var instance = new SubType();
20
21   console.log(instance.getSuperValue());//true

前三行创建了一个名为SuperType的构造器,并为其添加了一个属性propertype,其值设为true,然后在SuperType的原型上添加方法getSuperValue,功能是输出属性property的值,第一个构造函数完毕。9到11行创建第二个构造函数并添加属性subproperty,其值设为false。重点部分:第13行,把一个SuperType的实例赋值给SubType的原型。后面同样为SubType的原型添加一个方法。然后创建一个Subtype的实例,调用getSuperValue方法,返回true。

下面来仔细分析一下这条原型链,首先创造一个构造函数SuperType,它指向自己的原型,而原型的constructor有指向SuperType,这是第一部分,第二次创造了新的构造函数SubType,它的实例instance指向它的原型,而它的原型已经被设定为一个SuperType的实例,而这个实例又指向SuperType的原型,所以这部分和刚刚的第一部分就联系起来了,问题来了,instance。constructor是谁?沿着刚刚说的原型链向上找,

console.log(instance.constructor);//SuperType

同理,SuperType其实还能沿着原型链向上,上面就是Object。

第二种:借用构造函数,上代码:

 1 function SuperType(name){
 2     this.name = name;
 3   }
 4
 5   function SubType(){
 6     SuperType.call(this,"jiangjie");
 7     this.age = 20;
 8   }
 9
10   var instance = new SubType();
11
12   console.log(instance.name);//jiangjie
13   console.log(instance.age);//20
14
15   console.log(instance.constructor);//Subtype
16   console.log(Object.getPrototypeOf(instance)==SubType.prototype);//true
17
18   console.log(instance.hasOwnProperty("name"));//true

这样的写法就更容易理解了,使用call只是使用了Supertype的属性,但是并没有改动任何的原型链,我们可以使用hasOwnProperty来证明并不是调用了SuperType作为原型,

第三种:组合继承,上代码

 1 function SuperType(name){
 2     this.color = ['red','black','white'];
 3     this.name = name;
 4   }
 5
 6
 7   SuperType.prototype.sayName = function(){
 8     console.log(this.name);
 9   }
10
11   function SubType(name,age){
12     SuperType.call(this,name);
13     this.age = age;
14   }
15
16   SubType.prototype = new SuperType();
17
18   SubType.prototype.sayAge = function(){
19     console.log(this.age);
20   }
21
22   var instance1 = new SubType('jaingjie','20');
23   var instance2 = new SubType('lukexin','20');
24
25   instance1.color.push('green');
26   console.log(instance1.color);//['red','black','white','green'];
27   console.log(instance1.sayName());//jiangjie
28   console.log(instance1.sayAge());//20
29
30   console.log(instance2.color);//['red','black','white'];
31   console.log(instance2.sayName());//lukexin
32   console.log(instance2.sayAge());//20

说白了就是改进版,集中各个方法所长,使用 借用构造函数 方法,来设定各自实例属性,通过原型来设定通用的方法,但是要注意,为了确保构造函数不会重写子类的属性,要在调用超类型构造函数以后,再为子类添加属性

转载于:https://www.cnblogs.com/aichihuamei/p/6602037.html

js高程(二)-----继承相关推荐

  1. js面试题继承的方法及优缺点解答

    这篇文章主要为大家介绍了js面试题继承的方法及优缺点解答,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 目录 说一说js继承的方法和优缺点? 一.原型链继承 二.借用构造 ...

  2. 【前端知识之JS】JS如何实现继承

    前言 本系列主要整理前端面试中需要掌握的知识点.本节介绍JS如何实现继承. 文章目录 前言 一.什么是继承 二.实现方式 1. 原型链继承 2. 构造函数继承 3. 组合继承 4. 原型式继承 5. ...

  3. 对 js 高程 Preflighted Reqeusts 的理解

    看JS高程遇到 Preflighted Reqeusts不大理解,遂百度下: 转自:http://todoit.me/ajax-preflight/ 最近在做一个 VUE 的项目的时候, 和后端的小伙 ...

  4. C++继承机制(二)——继承中的构造和析构顺序、继承同名成员的处理方式

    目录: C++继承机制(一)--基本语法.三种继承方式.继承哪些数据 C++继承机制(二)--继承中的构造和析构顺序.继承同名成员的处理方式 C++继承机制(三)--多继承.菱形继承.虚继承原理 本篇 ...

  5. llqrcode.js识别二维码,解析二维码信息

    llqrcode.js具有扫描二维码功能,用来进行从图片中识别二维码,可解析二维码的信息. 直接上代码 <!DOCTYPE html> <html> <head>& ...

  6. JS生成二维码(兼容各种浏览器及中文)

    本文将介绍如何使用JS生成二维码,兼容各种浏览器及手机端,支持中文. 代码如下: <!DOCTYPE html> <html> <head> <meta ch ...

  7. 【JavaSe】面向对象篇(五) 三大特征之二继承

    JavaSe·面向对象篇(五) 三大特征之二继承 1. 面向对象三大特质之继承 1.1 由来 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那 ...

  8. js生成二维码以及插入图片

    js生成二维码以及插入图片 先根据qrcode官网demo,不同属性值的变化,二维码的变化效果:https://larsjung.de/jquery-qrcode/latest/demo/ 进入dem ...

  9. JS 生成二维码实现(qrcode.js)

    qrcode.js源码地址: https://github.com/jeromeetienne/jquery-qrcode 使用 页面引入QRCode.js和JQuery.js <script ...

最新文章

  1. Android核心基础第八天
  2. 请参阅:Chrome开发者工具中的悬停状态
  3. 【攻防世界001】Guess-the-Number
  4. c语言printf%%,c语言printf实现同一位置打印输出的实例分享
  5. HTML/BODY的背景渲染原理
  6. winform通过ListView绑定数据库数据源
  7. Jelastic Java云端平台
  8. ASP.NET MVC+LINQ开发一个图书销售站点(9):编辑目录
  9. 两种大小端判断的方式
  10. Python笔记-uiautomator2截图点击,OpenCV找图
  11. Tomcat 添加为系统服务 开机自动启动
  12. 嵌入式电路设计(电路仿真)
  13. 手动给64位centos6.3版本linux的firefox安装Adobe flash player
  14. YellowBrick-聚类评估示例
  15. 如何使用 Lucene 做网站高亮搜索功能?
  16. 五、bootstrap-fileinput
  17. openGL ES进阶教程(六)美颜滤镜之美白,磨皮,红润
  18. PBC【Packaged Business Capabilities】的理解
  19. docker中安装mongo3.2
  20. mysql关闭空闲连接_终止空闲的mysql连接

热门文章

  1. leetcode笔记:Gray Code(2016腾讯软件开发笔试题)
  2. IOS UITableView性能优化
  3. Word 2003高级技巧之可爱的锚标记
  4. Visual Studio 2008/2010中Xaml开发格式设置技巧
  5. .Net Core中利用TPL(任务并行库)构建Pipeline处理Dataflow
  6. 2016中国知识管理发展的7个趋势
  7. 【职场攻略】是什么决定了我们的工资
  8. 设置winfrom窗体透明度,拖动,任务栏中显示窗体
  9. symfony的安装方法
  10. 阅读器关闭时Read的尝试无效