JavaScript寄生组合式继承原理与用法分析


Posted in Javascript onJanuary 11, 2019

本文实例讲述了JavaScript寄生组合式继承。分享给大家供大家参考,具体如下:

寄生组合式继承

寄生组合式继承,就是通过伪造对象来继承属性,通过原型链的混成形式来继承方法。

这种技术的基本思路是:不必为了指定子类型的原型而调用超类型的构造函数,因为我们所需要的只是超类型原型的一个副本而已(这一点正是组合继承的问题,并且正是JavaScript这种原型式语言的强大之处,直接copy对象-原型对象)。本质上,就是使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型。

function inheritPrototype(subType, superType){
  var prototype = Object.create(superType.prototype); //创建超类型原型副本
  prototype.constructor = subType;          //修改原型副本的不同属性
  subType.prototype = prototype;           //指定原型
}
function SuperType(name){
  this.name = name;
  this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function(){
  console.log(this.name);
}
function SubType(name, age){
  //继承属性
  SuperType.call(this, name);
  //实例属性
  this.age = age;
}
//继承方法
inheritPrototype(SubType, SuperType);
SubType.prototype.sayAge = function(){
  console.log(this.age);
};
var instance1 = new SubType("Nicholas", 29);
instance1.colors.push("black");
console.log(instance1.colors); //"red, blue, green, black"
instance1.sayName();      //"Nicholas"
instance1.sayAge();      //29

这里使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码,可得如下运行结果:

JavaScript寄生组合式继承原理与用法分析

这个是寄生组合式继承的最简单形式。这个函数接收两个参数:

1. 子类型构造函数
2. 超类型构造函数

在函数内部,寄生组合式继承最简形式分为3个步骤:

1. 创建超类型原型副本;
2. 为创建的副本指定constructor属性,从而弥补因为重写SubType原型而失去的默认的constructor属性,这个原型副本的constructor属性变化:SuperType ?> SubType;
3. 将该完善好的副本赋值给子类型的原型。

寄生组合式继承的图解如下:

JavaScript寄生组合式继承原理与用法分析

寄生组合式继承的高效率体现在它只调用了一次SuperType构造函数,并且因此避免了在SubType.prototype上面创建不必要的,多余的属性。与此同时,原型链还能保持不变。

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
Jan 05 Javascript
JS重要知识点小结
Nov 06 Javascript
js正文内容高亮效果的实现方法
Jun 30 Javascript
juery框架写的弹窗效果适合新手
Nov 27 Javascript
XML文件转化成NSData对象的方法
Aug 12 Javascript
D3.js实现直方图的方法详解
Sep 25 Javascript
Vue.js路由组件vue-router使用方法详解
Dec 02 Javascript
JS实现评价的星星功能
Aug 20 Javascript
vue 录制视频并压缩视频文件的方法
Jul 27 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
May 29 Javascript
手把手带你搭建一个node cli的方法示例
Aug 07 Javascript
VsCode里的Vue模板的实现
Aug 12 Javascript
JavaScript常见继承模式实例小结
Jan 11 #Javascript
JavaScript惰性求值的一种实现方法示例
Jan 11 #Javascript
JavaScript创建对象的四种常用模式实例分析
Jan 11 #Javascript
详解Vue项目部署遇到的问题及解决方案
Jan 11 #Javascript
VeeValidate 的使用场景以及配置详解
Jan 11 #Javascript
JS函数节流和防抖之间的区分和实现详解
Jan 11 #Javascript
微信公众号H5支付接口调用方法
Jan 10 #Javascript
You might like
PHP4之COOKIE支持详解
2006/10/09 PHP
php 数据库字段复用的基本原理与示例
2011/07/22 PHP
php时间戳转换的示例
2014/03/31 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
JQuery显示、隐藏div的几种方法简明总结
2015/04/16 Javascript
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
vue 数组和对象不能直接赋值情况和解决方法(推荐)
2017/10/25 Javascript
其实你可以少写点if else与switch(推荐)
2019/01/10 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
python3调用R的示例代码
2018/02/23 Python
解决pip install的时候报错timed out的问题
2018/06/12 Python
对numpy中数组转置的求解以及向量内积计算方法
2018/10/31 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
python实现简单图书管理系统
2019/11/22 Python
世界上最大的糖果店:Dylan’s Candy Bar
2017/11/07 全球购物
毕业班联欢会主持词
2014/03/27 职场文书
继承公证书样本
2014/04/04 职场文书
报关报检委托书
2014/04/08 职场文书
小学生作文评语
2014/04/18 职场文书
部门活动策划方案
2014/08/16 职场文书
2014年高中班主任工作总结
2014/11/08 职场文书
招标保密承诺书
2015/01/20 职场文书
杨善洲观后感
2015/06/04 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书