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 相关文章推荐
基于mouseout和mouseover等类似事件的冒泡问题解决方法
Nov 18 Javascript
浅谈JavaScript函数参数的可修改性问题
Dec 05 Javascript
JS的document.all函数使用示例
Dec 30 Javascript
按Enter键触发事件的jquery方法实现代码
Feb 17 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
Feb 28 Javascript
了不起的node.js读书笔记之node的学习总结
Dec 22 Javascript
jQuery实现在HTML文档加载完毕后自动执行某个事件的方法
May 08 jQuery
js实现京东轮播图效果
Jun 30 Javascript
vue父子组件的嵌套的示例代码
Sep 08 Javascript
微信小程序支付之c#后台实现方法
Oct 19 Javascript
javascript function(函数类型)使用与注意事项小结
Jun 10 Javascript
layer插件实现在弹出层中弹出一警告提示并关闭弹出层的方法
Sep 24 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定时更新程序设计思路分享
2014/06/10 PHP
PHP curl使用实例
2015/07/02 PHP
php验证码的制作思路和实现方法
2015/11/12 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
2014/03/08 Javascript
详解AngularJS的通信机制
2015/06/18 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
在Vue项目中使用Typescript的实现
2019/12/19 Javascript
js仿360开机效果
2019/12/26 Javascript
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
基于Django用户认证系统详解
2018/02/21 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
keras 自定义loss model.add_loss的使用详解
2020/06/22 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
详解Pytorch显存动态分配规律探索
2020/11/17 Python
美国摩托车头盔、零件、齿轮及配件商店:Cycle Gear
2019/06/12 全球购物
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
小米官方旗舰店:Xiaomi
2020/08/07 全球购物
本科毕业生的求职信范文
2013/11/20 职场文书
高中班级口号
2014/06/09 职场文书
专科生就业求职信
2014/06/22 职场文书
幼儿园父亲节活动总结
2015/02/12 职场文书
项目负责人岗位职责
2015/02/15 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python