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 当前日期加(天、周、月、年)
Aug 09 Javascript
Javascript常考语句107条收集
Mar 09 Javascript
25个非常棒的jQuery滑块插件和教程小结
Sep 02 Javascript
网站404页面3秒后跳到首页的实例代码
Aug 16 Javascript
Javascript 计算字符串在localStorage中所占字节数
Oct 21 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
Oct 25 Javascript
JS中常用的输出方式(五种)
Jun 12 Javascript
JavaScript实现时钟滴答声效果
Jan 29 Javascript
vue上传图片组件编写代码
Jul 26 Javascript
vue+swiper实现组件化开发的实例代码
Oct 26 Javascript
Angular学习教程之RouterLink花式跳转
May 03 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
Aug 03 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进行MySQL删除记录操作代码
2008/06/07 PHP
php5.3提示Function ereg() is deprecated Error问题解决方法
2014/11/12 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
php的闭包(Closure)匿名函数详解
2015/02/22 PHP
Yii2单元测试用法示例
2016/11/12 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
js获取提交的字符串的字节数
2009/02/09 Javascript
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
轮播图组件js代码
2016/08/08 Javascript
KnockoutJS 3.X API 第四章之click绑定
2016/10/10 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
微信小程序 判断手机号的实现代码
2017/04/19 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
Angular网络请求的封装方法
2018/05/22 Javascript
小程序如何获取多个formId实现详解
2019/09/20 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
koa中间件核心(koa-compose)源码解读分析
2020/06/15 Javascript
vue实现简单的登录弹出框
2020/10/26 Javascript
python 输出一个两行字符的变量
2009/02/05 Python
Python程序设计入门(3)数组的使用
2014/06/16 Python
Python常用的日期时间处理方法示例
2015/02/08 Python
Python函数的周期性执行实现方法
2016/08/13 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
HTML5新增加的功能详解
2016/09/05 HTML / CSS
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
教师专业自荐书范文
2014/02/10 职场文书
银行会计主管岗位职责
2014/10/01 职场文书
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python
Go语言特点及基本数据类型使用详解
2022/03/21 Golang