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的面向对象(一)
Nov 09 Javascript
把textarea中字符串里含有的回车换行替换成<br>的javascript代码
Apr 20 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
Jan 15 Javascript
只需一行代码,轻松实现一个在线编辑器
Nov 12 Javascript
javascript模拟订火车票和退票示例
Apr 24 Javascript
jQuery+html5实现div弹出层并遮罩背景
Apr 15 Javascript
JS与jQuery实现隔行变色的方法
Sep 09 Javascript
原生js实现下拉框功能(支持键盘事件)
Jan 13 Javascript
vue2.0 axios前后端数据处理实例代码
Jun 30 Javascript
React组件refs的使用详解
Feb 09 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
Sep 21 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模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
php计算整个目录大小的方法
2015/06/01 PHP
PHP应用跨时区功能的实现方法
2019/03/21 PHP
在jQuery1.5中使用deferred对象 着放大镜看Promise
2011/03/12 Javascript
js中replace的用法总结
2013/12/27 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
js实现拉幕效果的广告代码
2015/09/02 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
简单实现限制uploadify上传个数
2015/11/16 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
Javascript将字符串日期格式化为yyyy-mm-dd的方法
2016/10/27 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
python类中super()和__init__()的区别
2016/10/18 Python
Python用threading实现多线程详解
2017/02/03 Python
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
2019/03/01 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
《最大的“书”》教学反思
2014/02/14 职场文书
授权委托书怎么写
2014/04/03 职场文书
《风娃娃》教学反思
2014/04/19 职场文书
空气的环保标语
2014/06/12 职场文书
学校政风行风整改方案
2014/10/25 职场文书
汽车转让协议书范本
2014/12/07 职场文书
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang