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 相关文章推荐
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
Jan 09 Javascript
JQuery设置和去除disabled属性的5种方法总结
May 16 Javascript
对比分析json及XML
Nov 28 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
Mar 05 Javascript
轻松掌握JavaScript中的Math object数学对象
May 26 Javascript
Angularjs的ng-repeat中去除重复数据的方法
Aug 05 Javascript
JS简单获取日期相差天数的方法
Apr 24 Javascript
JS自定义函数实现时间戳转换成date的方法示例
Aug 27 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
Jan 11 Javascript
详解JSON Web Token 入门教程
Jul 30 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
Sep 08 Javascript
Vue自定义多选组件使用详解
Sep 08 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调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
2012/08/08 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
javascript Base类 包含基本的方法
2009/07/22 Javascript
写给想学习Javascript的朋友一点学习经验小结
2010/11/23 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
Javascript中3种实现继承的方法和代码实例
2014/08/12 Javascript
关闭页面window.location事件未执行的原因及解决方法
2014/09/01 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
jQuery 实现扁平式小清新导航
2020/07/07 jQuery
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
Django中的用户身份验证示例详解
2019/08/07 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
Python字典取键、值对的方法步骤
2020/09/30 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
党支部承诺书范文
2014/03/28 职场文书
自我工作评价范文
2015/03/06 职场文书
党委工作总结2015
2015/04/27 职场文书
大学军训心得体会800字
2016/01/11 职场文书
初中化学教学反思
2016/02/22 职场文书