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 相关文章推荐
一个很简单的办法实现TD的加亮效果.
Jun 29 Javascript
常用参考资料(手册)下载或者链接
Jul 22 Javascript
jquery validation插件表单验证的一个例子
Mar 03 Javascript
from表单多个按钮提交用onclick跳转不同action
Apr 24 Javascript
js判断游览器类型及版本号的代码
May 11 Javascript
AngularJS基础 ng-submit 指令简单示例
Aug 03 Javascript
浅谈node的事件机制
Oct 09 Javascript
微信小程序中时间戳和日期的相互转换问题
Jul 09 Javascript
JS大坑之19位数的Number型精度丢失问题详解
Apr 22 Javascript
js实现窗口全屏示例详解
Sep 17 Javascript
使用pkg打包ThinkJS项目的方法步骤
Dec 30 Javascript
iview实现动态表单和自定义验证时间段重叠
Jan 10 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
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
2006/10/09 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
PHP实现的各类hash算法长度及性能测试实例
2017/08/27 PHP
PHP中遍历数组的三种常用方法实例分析
2019/06/24 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
javascript 传统事件模型构造的事件监听器实现代码
2010/05/31 Javascript
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
2012/12/21 Javascript
JS随机生成不重复数据的实例方法
2013/07/17 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
理解javascript异步编程
2016/01/27 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
Javascript 跨域知识详细介绍
2016/10/30 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
简单的通用表达式求10乘阶示例
2014/03/03 Python
Python写的英文字符大小写转换代码示例
2015/03/06 Python
python使用PyCharm进行远程开发和调试
2017/11/02 Python
selenium + python 获取table数据的示例讲解
2018/10/13 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
Python 硬币兑换问题
2019/07/29 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
Raffaello Network西班牙:意大利拉斐尔时尚购物网
2019/03/12 全球购物
行政总经理岗位职责
2013/12/05 职场文书
工商行政处罚决定书
2015/06/24 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
JavaScript继承的三种方法实例
2021/05/12 Javascript
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技