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 相关文章推荐
一页面多XMLHttpRequest对象
Jan 22 Javascript
JavaScript delete操作符应用实例
Jan 13 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
Sep 19 Javascript
javascript简单进制转换实现方法
Nov 24 Javascript
vue多种弹框的弹出形式的示例代码
Sep 18 Javascript
jQuery响应滚动条事件功能示例
Oct 14 jQuery
微信小程序使用Promise简化回调
Feb 06 Javascript
使用JS代码实现俄罗斯方块游戏
Aug 03 Javascript
使用vue实现各类弹出框组件
Jul 03 Javascript
javascript用defineProperty实现简单的双向绑定方法
Apr 03 Javascript
小程序实现图片移动缩放效果
May 26 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
Aug 22 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
php 正则表达式小结
2009/08/31 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
2012/07/19 PHP
基于PHP Web开发MVC框架的Smarty使用说明
2013/04/19 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
js滚轮事件兼容性问题需要注意哪些
2016/11/15 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
tween.js缓动补间动画算法示例
2018/02/13 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
使用Vue动态生成form表单的实例代码
2018/04/26 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
Vue实现指令式动态追加小球动画组件的步骤
2020/12/18 Vue.js
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
django 修改server端口号的方法
2018/05/14 Python
Python实现登陆文件验证方法
2018/10/06 Python
对python中的six.moves模块的下载函数urlretrieve详解
2018/12/19 Python
pyshp创建shp点文件的方法
2018/12/31 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
下列程序在32位linux或unix中的结果是什么
2015/01/26 面试题
通信工程专业女生个人求职信
2013/09/21 职场文书
项目建议书范文
2014/05/12 职场文书
2015年校长新年寄语
2014/12/08 职场文书
自主招生自荐信范文
2015/03/04 职场文书
雨中的树观后感
2015/06/03 职场文书
关于JS中的作用域中的问题思考分享
2022/04/06 Javascript