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 相关文章推荐
dojo 之基础篇(三)之向服务器发送数据
Mar 24 Javascript
Javascript 验证上传图片大小[客户端]
Aug 01 Javascript
js getBoundingClientRect() 来获取页面元素的位置
Nov 25 Javascript
node.js操作mongodb学习小结
Apr 25 Javascript
Jquery中巧用Ajax的beforeSend方法
Jan 20 Javascript
浅析在javascript中创建对象的各种模式
May 06 Javascript
Javascript中级语法快速入手
Jul 30 Javascript
Node.js数据库操作之查询MySQL数据库(二)
Mar 04 Javascript
Vue进度条progressbar组件功能
Apr 17 Javascript
修改vue+webpack run build的路径方法
Sep 01 Javascript
简单了解Vue + ElementUI后台管理模板
Apr 07 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
May 03 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知道与问问的采集插件代码
2010/10/12 PHP
php tp验证表单与自动填充函数代码
2012/02/22 PHP
php curl 伪造IP来源的实例代码
2012/11/01 PHP
PHP CURL使用详解
2019/03/21 PHP
PHP中PCRE正则解析代码详解
2019/04/26 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
一些常用弹出窗口/拖放/异步文件上传等实用代码
2013/01/06 Javascript
javascript中的startWith和endWith的几种实现方法
2013/05/07 Javascript
jquery 根据name名获取元素的value值
2015/02/27 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
less简单入门(CSS 预处理语言)
2017/03/08 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
Vue 进入/离开动画效果
2017/12/26 Javascript
Vue 换肤的示例实践
2018/01/23 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
Angular数据绑定机制原理
2018/04/17 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
2020/03/12 Javascript
python 3.6.2 安装配置方法图文教程
2018/09/18 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
2019/12/12 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
大学生简单自荐信
2013/11/10 职场文书
小学科学教学反思
2014/01/26 职场文书
优秀部门获奖感言
2014/02/14 职场文书
运动会横幅标语
2014/06/17 职场文书
公司承诺函范文
2015/01/21 职场文书