JS 面向对象之继承---多种组合继承详解


Posted in Javascript onJuly 10, 2016

这一次要讲 组合、原型式、寄生式、寄生组合式继承方式。

1. 组合继承:又叫伪经典继承,是指将原型链和借用构造函数技术组合在一块的一种继承方式。

下面来看一个例子:

function SuperType(name) {
    this.name = name;
    this.colors = ["red", "blue", "green"];
  }
  SuperType.prototype.sayName = function() {
    alert(this.name);
  }
  function SubType(name, age) {
    SuperType.call(this, name);
    this.age = age;
  }

  //继承方法
  SubType.prototype = new SuperType();
  SubType.prototype.sayAge = function() {
    alert(this.age);
  }

  var instance1 = new SubType("Nicholas", 29);
  instance1.colors.push("black");
  alert(instance1.colors); //red,blue,green,black
  instance1.sayName(); //Nicholas
  instance1.sayAge(); //29

  var instance2 = new SubType("Greg", 27);
  alert(instance2.colors); //red,blue,green
  instance2.sayName(); //Greg
  instance2.sayAge(); //27

组合继承避免了原型链和借用构造函数的缺陷,融合它们的优点。

2. 原型式继承

可以在不必预先定义构造函数的情况下实现继承,其本质是执行对给定对象的浅复制。而复制得到的副本还可以得到进一步的改造。

function object(o) {
    function F(){};
    F.prototype = o;
    return new F;
  }

  var person = {
   name: "Nicholas",
   friends: ["Shelby", "Court", "Van"]
  };

  var antherPerson = object(person);
  antherPerson.name = "Greg";
  antherPerson.friends.push("Rob");

  var antherPerson = object(person);
  antherPerson.name = "Linda";
  antherPerson.friends.push("Barbie");

  alert(person.friends); //Shelby,Court,Van,Rob,Barbie

3. 寄生式继承

与原型式继承非常相似,也是基于某个对象或某些信息创建一个对象,然后增强对象,最后返回对象。为了解决组合继承模式由于多次调用超类型构造函数而导致的低效率问题,可以将这个模式与组合继承一起使用。

function object(o) {
    function F(){};
    F.prototype = o;
    return new F;
  }
  function createAnother(original) {
    var clone = object(original);
    clone.sayHi = function() {
      alert("Hi");
    };
    return clone;
  }

  var person = {
    name: "Nicholas",
    friends: ["Shelby", "Court", "Van"]
  };

  var anotherPerson = createAnother(person);
  anotherPerson.sayHi();

4. 寄生组合式继承

集寄生式继承和组合继承的优点与一身,是实现基本类型继承的最有效方式。

//继承原型
  function extend(subType, superType) {
    function F(){};
    F.prototype = superType.prototype;

    var prototype = new F;
    prototype.constructor = subType;
    subType.prototype = prototype;
  }

  //超类方法
  function SuperType(name) {
    this.name = name;
    this.colors = ["red", "blue", "green"];
  }
  SuperType.prototype.sayName = function() {
    return this.name;
  }

  //子类方法
  function SubType(name, age) {
    SuperType.call(this, name);
    this.age = age;
  }

  //继承超类的原型
  extend(SubType, SuperType);

  //子类方法
  SubType.prototype.sayAge = function() {
    return this.age;
  }

  var instance1 = new SubType("Shelby");
  var instance2 = new SubType("Court", 28);

  instance1.colors.push('black');

  alert(instance1.colors); //red,blue,green,black
  alert(instance2.colors); //red,blue,green

  alert(instance1 instanceof SubType); //true
  alert(instance1 instanceof SuperType); //true

这段例子的高效率体现在它只调用了一次SuperType构造函数,并且因此避免了在SubType.prototype上面创建不必要的多余的属性。与此同时,原型链还能保持不变。因此,还能正常使用instanceof 和 isPrototypeOf()。开发人员普遍认为寄生组合式继承是引用类型最理想的继承范式。

以上这篇JS 面向对象之继承---多种组合继承详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
splice slice区别
Oct 09 Javascript
js 复制或插入Html的实现方法小结
May 19 Javascript
jquery中通过过滤器获取表单元素的实现代码
Jul 05 Javascript
跟我学习javascript的arguments对象
Nov 16 Javascript
Bootstrap学习笔记之css样式设计(2)
Jun 07 Javascript
ES6学习笔记之Set和Map数据结构详解
Apr 07 Javascript
巧用weui.topTips验证数据的实例
Apr 17 Javascript
es6学习笔记之Async函数基本教程
May 11 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
Apr 27 Javascript
JS实现长图上下滚动效果
Mar 19 Javascript
JavaScript语句错误throw、try及catch实例解析
Aug 18 Javascript
前端vue如何使用高德地图
Nov 05 Javascript
js生成随机数(指定范围)的实例代码
Jul 10 #Javascript
JS获取随机数和时间转换的简单实例
Jul 10 #Javascript
JS生成不重复的随机数组的简单实例
Jul 10 #Javascript
浅谈JavaScript对象与继承
Jul 10 #Javascript
Bootstrap框架下下拉框select搜索功能
Mar 26 #Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
Jul 10 #Javascript
深入浅析JavaScript函数前面的加号和叹号
Jul 09 #Javascript
You might like
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
PHP中的output_buffering详细介绍
2014/09/27 PHP
PHP验证码生成原理和实现
2016/01/24 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
jQuery代码优化方法总结
2018/01/29 jQuery
js统计页面上每个标签的数量实例代码
2018/05/29 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
python笔记:mysql、redis操作方法
2017/06/28 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
Pandas读写CSV文件的方法示例
2019/03/27 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
2020/03/06 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
2020/04/16 Python
使用python采集Excel表中某一格数据
2020/05/14 Python
tensorflow 动态获取 BatchSzie 的大小实例
2020/06/30 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
Topshop法国官网:英国快速时尚品牌
2018/04/08 全球购物
为娇小女性量身打造:Petite Studio
2018/11/01 全球购物
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
网上商城创业计划书范文
2014/01/31 职场文书
函授药学自我鉴定
2014/02/07 职场文书
学生会招新策划书
2014/02/14 职场文书
会员卡清退活动总结
2014/08/27 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
七年级生物教学反思
2016/02/20 职场文书
redis使用不当导致应用卡死bug的过程解析
2021/07/01 Redis