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 相关文章推荐
JQuery 获取和设置Select选项的代码
Feb 07 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
Jun 04 Javascript
js 显示base64编码的二进制流网页图片
Apr 04 Javascript
js字符串完全替换函数分享
Dec 03 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
Oct 12 Javascript
深入解析JavaScript编程中的this关键字使用
Nov 09 Javascript
Jquery调用iframe父页面中的元素及方法
Aug 23 Javascript
jQuery中each遍历的三种方法实例分析
Sep 07 jQuery
vue组件创建的三种方式小结
Feb 03 Javascript
Vue3新特性之在Composition API中使用CSS Modules
Jul 13 Javascript
JS JQuery获取data-*属性值方法解析
Sep 01 jQuery
在vue中获取wangeditor的html和text的操作
Oct 23 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/11/15 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
Laravel框架搜索分页功能示例
2019/02/01 PHP
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
JavaScript 字符串处理函数使用小结
2010/12/02 Javascript
javascript hashtable 修正版 下载
2010/12/30 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
Jquery Easyui选项卡组件Tab使用详解(10)
2016/12/18 Javascript
NPM 安装cordova时警告:npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to
2016/12/20 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
Vue axios 跨域请求无法带上cookie的解决
2020/09/08 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
Python基础语法(Python基础知识点)
2016/02/28 Python
virtualenv实现多个版本Python共存
2017/08/21 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
const和static readonly区别
2013/05/20 面试题
什么是继承
2013/12/07 面试题
90后毕业生的求职信范文
2013/09/21 职场文书
毕业生自荐信
2013/12/14 职场文书
《十六年前的回忆》教学反思
2014/02/14 职场文书
2015年信贷员工作总结
2015/04/28 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android