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定时机制
Oct 29 Javascript
IE6下opacity与JQuery的奇妙结合
Mar 01 Javascript
类似天猫商品详情随浏览器移动的示例代码
Feb 27 Javascript
Node.js和PHP根据ip获取地理位置的方法
Mar 14 Javascript
基于jQuery通过jQuery.form.js插件实现异步上传
Dec 13 Javascript
详解在AngularJS的controller外部直接获取$scope
Jun 02 Javascript
JavaScript中最常用的10种代码简写技巧总结
Jun 28 Javascript
vue输入节流,避免实时请求接口的实例代码
Oct 30 Javascript
jQuery实现的上拉刷新功能组件示例
May 01 jQuery
js实现ajax的用户简单登入功能
Jun 18 Javascript
viewer.js实现图片预览功能
Jun 24 Javascript
记一次vue跨域的解决
Oct 21 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(3)
2006/10/09 PHP
wamp安装后自定义配置的方法
2014/08/23 PHP
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
纯js实现仿QQ邮箱弹出确认框
2015/04/29 Javascript
Jquery 分页插件之Jquery Pagination
2015/08/25 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
BootStrap实现手机端轮播图左右滑动事件
2016/10/13 Javascript
JS正则替换掉小括号及内容的方法
2016/11/29 Javascript
JavaScript省市级联下拉菜单实例
2017/02/14 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
BootStrap Table 后台数据绑定、特殊列处理、排序功能
2017/05/27 Javascript
前端构建工具之gulp的语法教程
2017/06/12 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
2017/07/28 Javascript
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
在vue中created、mounted等方法使用小结
2020/07/21 Javascript
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python笔记(叁)继续学习
2012/10/24 Python
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
Python变量和数据类型详解
2017/02/15 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
flask框架路由常用定义方式总结
2019/07/23 Python
Python爬虫:Request Payload和Form Data的简单区别说明
2020/04/30 Python
解决CSS3的opacity属性带来的层叠顺序问题
2016/05/09 HTML / CSS
2014年五四青年节活动方案
2014/03/29 职场文书
男女朋友协议书
2014/04/23 职场文书
拆迁委托协议书
2014/09/15 职场文书
买卖合同协议书范本
2014/10/18 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书
入党心得体会
2019/06/20 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
Netty结合Protobuf进行编解码的方法
2021/06/26 Java/Android