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 相关文章推荐
JavaScript Prototype对象
Jan 07 Javascript
JavaScript 的方法重载效果
Aug 07 Javascript
jQuery之网页换肤实现代码
Apr 30 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
Dec 13 Javascript
jQuery判断当前点击的是第几个li的代码
Sep 26 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
May 16 Javascript
使用angular帮你实现拖拽的示例
Jul 05 Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
Sep 01 Javascript
jQuery实现简单的Ajax调用功能示例
Feb 15 jQuery
微信小程序开发注意指南和优化实践(小结)
Jun 21 Javascript
vue数据响应式原理知识点总结
Feb 16 Javascript
在antd Form表单中select设置初始值操作
Nov 02 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在Web开发领域的优势
2006/10/09 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
windows7下php开发环境搭建图文教程
2015/01/06 PHP
php微信公众账号开发之前五个坑(一)
2016/09/18 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
VSCode 配置uni-app的方法
2020/07/11 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
在Pycharm中对代码进行注释和缩进的方法详解
2019/01/20 Python
Django模板语言 Tags使用详解
2019/09/09 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
pandas数据拼接的实现示例
2020/04/16 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
编写strcpy函数
2014/06/24 面试题
Android面试题附答案
2014/12/08 面试题
介绍一下Mysql的存储引擎
2015/02/12 面试题
Shell脚本如何向终端输出信息
2014/04/25 面试题
技校生自我鉴定
2013/12/08 职场文书
2014年国庆节寄语
2014/09/19 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
2016年母亲节寄语
2015/12/04 职场文书
vue如何清除浏览器历史栈
2022/05/25 Vue.js