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 相关文章推荐
获取Javscript执行函数名称的方法
Dec 22 Javascript
IE8 引入跨站数据获取功能说明
Jul 22 Javascript
javascript 另一种图片滚动切换效果思路
Apr 20 Javascript
JavaScript整除运算函数ceil和floor的区别分析
Apr 14 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
May 17 Javascript
浅谈JS中的!=、== 、!==、===的用法和区别
Sep 24 Javascript
详解jQuery lazyload 懒加载
Dec 19 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
Mar 21 Javascript
Vue程序调试的方法
Jun 17 Javascript
微信小程序 scroll-view 实现锚点跳转功能
Dec 12 Javascript
详细分析Node.js 多进程
Jun 22 Javascript
利用JavaScript模拟京东按键输入功能
Dec 01 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
加速XP搜索功能堪比vista
2007/03/22 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
php获取错误信息的方法
2015/07/17 PHP
php字符集转换
2017/01/23 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
2015/12/02 Javascript
js原生之焦点图转换加定时器实例
2016/12/12 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
跟老齐学Python之Python文档
2014/10/10 Python
python登陆asp网站页面的实现代码
2015/01/14 Python
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
python判断链表是否有环的实例代码
2020/01/31 Python
Tensorflow 多线程设置方式
2020/02/06 Python
读取nii或nii.gz文件中的信息即输出图像操作
2020/07/01 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
python如何对链表操作
2020/10/10 Python
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
团员学习总结的自我评价范文
2013/10/14 职场文书
高中自我鉴定范文
2013/11/03 职场文书
在校实习生求职信
2014/06/18 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
2014年租房协议书范本
2014/10/30 职场文书