Javascript组合继承方法代码实例解析


Posted in Javascript onApril 02, 2020

Javascript组合继承方法代码实例解析

组合继承

组合继承,指将原型链和借用构造函数的技术组合到一块,从而发挥二者之长的一种继承模式。其背后思路使用用原型链实现对原型属性和方法的继承,而通过构造函数来实现对实例属性的继承。这样,即通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性。

下面来看一个例子

function SuperType(name) {
  this.name = name;
  this.color = ['red', 'blue', 'green'];
};
//
SuperType.prototype.sayName = function() {
  console.log(this.name);
};
//
function SubType(name, age) {
  //继承属性
  SuperType.call(this, name);		// 第二次调用SuperType
//
  this.age = age;
};
//继承方法
SubType.prototype = new SuperType();	// 第一次调用SuperType
console.log(SubType.prototype.constructor); //输出SuperType函数的源码,即此时SubType.prototype.constructor指向SuperType函数
SubType.prototype.constructor = SubType; //将SubType.prototype.constructor指针指回SubType函数
SubType.prototype.sayAge = function() {
  console.log(this.age);
};
//
var instance1 = new SubType('Jake', 20)
instance1.color.push('black');
console.log(instance1.color); //'red,blue,green,black'
instance1.sayName(); //'Jake'
instance1.sayAge(); //20
//
var instance2 = new SubType('Greg', 21);
console.log(instance2.color); //'red,blue,green'
instance2.sayName(); //'Greg';
instance2.sayAge(); //21

观察输出结果,便可以发现:两个SubType实例(instance1和instance2)既分别有自己的属性,又可以使用相同的方法。

优点

组合继承避免了原型链和借用构造函数的缺陷,融合了它们的优点,所以是JS中最常用的继承模式。而且,instanceof和isPrototypeOf()也能够用于识别基于组合继承创建的对象。

缺点

调用两次SuperType构造函数

在SubType.prototype上创建了不必要的属性

寄生组合继承

function SuperType (name) {
 this.name = name
 this.colors = ['red', 'blue', 'yellow']
}

SuperType.prototype.sayName = function () {
 console.log(this.name)
}

function SubType (name, age) {
 SuperType.call(this, name) // 通过构造函数继承实例属性
 this.age = age
}

SubType.prototype = Object.create(SuperType.prototype)	//继承父类共享方法
SubType.prototype.constructor = SubType	//将SubType.prototype.constructor指针指回SubType函数
SubType.prototype.sayAge = function () {
 console.log(this.age)
}

let obj = new SubType('jake', 22)
obj.sayName()	// jake
obj.sayAge()	// 22
console.log(obj instanceof SubType)	// true
console.log(obj instanceof SuperType)	// true

优点

寄生组合继承只调用了一次SuperType,所以更高效

避免了在SubType.prototype上创建了不必要的属性

下面说说原型链和构造函数的缺点

原型链

缺点:当原型链中包含引用类型值时,原型属性会被所有实例共享;

下面看一个例子

function SuperType() {
  this.color = ['red', 'blue', 'green'];
}
//
function SubType() {};
//
SubType.prototype = new SuperType(); //继承了SuperType
//
var instance1 = new SubType();
instance1.color.push('black');
console.log(instance1.color);  //'red,blue,green,black'
//
var instance2 = new SubType();
console.log(instance2.color);  //'red,blue,green,black'

借用构造函数

缺点:如果仅仅使用构造函数,方法都在构造函数中定义,因此函数就无法实现复用了。而且,在超类型的原型中定义的方法,对于子类型而言也是不可见的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery prev ~ siblings选择器使用介绍
Aug 09 Javascript
JS简单实现文件上传实例代码(无需插件)
Nov 15 Javascript
怎么判断js脚本加载完成
Feb 28 Javascript
在JavaScript里防止事件函数高频触发和高频调用的方法
Sep 06 Javascript
vue.js利用Object.defineProperty实现双向绑定
Mar 09 Javascript
HTML5+jQuery实现搜索智能匹配功能
Mar 24 jQuery
Angular.js指令学习中一些重要属性的用法教程
May 24 Javascript
谈谈JavaScript中super(props)的重要性
Feb 12 Javascript
Moment.js实现多个同时倒计时
Aug 26 Javascript
vue 解除鼠标的监听事件的方法
Nov 13 Javascript
JS如何寻找数组中心索引过程解析
Jun 01 Javascript
Openlayers学习之加载鹰眼控件
Sep 28 Javascript
Javascript异步编程async实现过程详解
Apr 02 #Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 #Javascript
JavaScript运动原理基础知识详解
Apr 02 #Javascript
基于js实现逐步显示文字输出代码实例
Apr 02 #Javascript
webpack3.0升级4.0的方法步骤
Apr 02 #Javascript
Javascript模块化机制实现原理详解
Apr 02 #Javascript
sharp.js安装过程中遇到的问题总结
Apr 02 #Javascript
You might like
Apache2 httpd.conf 中文版
2006/11/17 PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
2014/06/08 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
2016/05/31 PHP
多广告投放代码 推荐
2006/11/13 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
angularjs基础教程
2014/12/25 Javascript
小米公司JavaScript面试题
2014/12/29 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
Vue常见面试题整理【值得收藏】
2018/09/20 Javascript
详解vue-cli3多环境打包配置
2019/03/28 Javascript
详解一些适用于Node.js的命名约定
2019/12/08 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
原生js实现购物车
2020/09/23 Javascript
JS检测浏览器开发者工具是否打开的方法详解
2020/10/02 Javascript
vue项目开启Gzip压缩和性能优化操作
2020/10/26 Javascript
python中MySQLdb模块用法实例
2014/11/10 Python
用Python写王者荣耀刷金币脚本
2017/12/21 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
索尼巴西商店:Sony巴西
2019/06/21 全球购物
农行实习自我鉴定
2013/09/22 职场文书
校园十佳歌手策划书
2014/01/22 职场文书
社区学习雷锋活动总结
2014/04/25 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
机电专业求职信
2014/06/14 职场文书
质量月口号
2014/06/20 职场文书
校园游戏活动新闻稿
2014/10/15 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
学期个人工作总结
2015/02/13 职场文书
奖学金主要事迹范文
2015/11/04 职场文书
MySQL Threads_running飙升与慢查询的相关问题解决
2021/05/08 MySQL