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 相关文章推荐
jquery imgareaselect 使用利用js与程序结合实现图片剪切
Jul 30 Javascript
IE浏览器打印的页眉页脚设置解决方法
Dec 08 Javascript
详解js闭包
Sep 02 Javascript
JavaScrip调试技巧之断点调试
Oct 22 Javascript
JavaScript实现Base64编码转换
Apr 23 Javascript
AngularJS 中文API参考手册
Jul 28 Javascript
js实现获取鼠标当前的位置
Dec 14 Javascript
JQuery页面随滚动条动态加载效果的简单实现(推荐)
Feb 08 Javascript
Angular4实现动态添加删除表单输入框功能
Aug 11 Javascript
JavaScript多线程运行库Nexus.js详解
Dec 22 Javascript
Vue组件通信的四种方式汇总
Feb 08 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
Oct 30 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
MySQL授权问题总结
2007/05/06 PHP
PHP IDE phpstorm 常用快捷键
2015/05/18 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
一个简单的js渐显(fadeIn)渐隐(fadeOut)类
2010/06/19 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
JavaScript函数中关于valueOf和toString的理解
2016/06/14 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
原生JS取代一些JQuery方法的简单实现
2016/09/20 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
基于node下的http小爬虫的示例代码
2018/01/11 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
详解vue.js数据传递以及数据分发slot
2018/01/20 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
python中函数传参详解
2016/07/03 Python
Python通过matplotlib绘制动画简单实例
2017/12/13 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
python读取csv文件指定行的2种方法详解
2020/02/13 Python
python ffmpeg任意提取视频帧的方法
2020/02/21 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
canvas绘制圆角头像的实现方法
2019/01/17 HTML / CSS
简历的自荐信
2013/12/19 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
2015年统战工作总结
2015/05/19 职场文书
百万英镑观后感
2015/06/09 职场文书
假如给我三天光明读书笔记
2015/06/26 职场文书
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技