JS中的继承操作实例总结


Posted in Javascript onJune 06, 2020

本文实例讲述了JS中的继承操作。分享给大家供大家参考,具体如下:

1.原型链继承

function SuperType() {
  this.property = true; 
}
SuperType.prototype.getSuperValue = function() {
  return this.property;
}
function SubType() {
  ths.subproperty = false;
}
SubType.prototype = new SuperType();   // 实现继承
SubType.prototype.getSubValue = function() {
  return this.subproperty;
}
var instance = new SubType();
console.log(instance.getSuperValue());   // true

原理:让SuperType的实例成为子类的原型对象,子类的实例拥有了父类的属性和方法。但也有弊端,如果父类的属性是引用类型,这将导致共享的属性被改变的时候,全部的属性将被改变,我们一下代码。

function SuperType() {
  this.property = [1,2,3]; 
}
SuperType.prototype.getSuperValue = function() {
  return this.property;
}
function SubType() {
  ths.subproperty = false;
}
SubType.prototype = new SuperType();   // 实现继承
SubType.prototype.getSubValue = function() {
  return this.subproperty;
}
var instance1 = new SubType();
var instance2 = new SubType();
instance1.property.push(4);
console.log(instance1.property);   // [1,2,3,4]
console.log(instance2.property);   // [1,2,3,4]

我们修改一处的实例属性,两个实例的属性都会被修改,因为这个属性是共享的,这也是原型链继承的缺点。

2.构造函数继承

function SuperType(name) {
  this.name = name;
  this.numbers = [1,2,3];
}
function SubType() {
  SuperType.call(this,"Nicholas");
  this.age = 29;
}

var instance1 = new SubType();
var instance2 = new SubType();
instance1.property.push(4);
console.log(instance1.name);    // Nicholas
console.log(instance1.age);     // 29
console.log(instance1.numbers);   // [1,2,3,4]
console.log(instance2.numbers); // [1,2,3]

在子类中调用父类的构造函数,每次实例化时都会新建父类的属性放在新实例中,因此每个实例中的属性都是不一样的,改变一个实例的值不会造成另一个实例的值改变。这个继承方式的缺点是方法的定义不能复用。

3.组合继承

这个方法将原型链继承和构造函数继承结合到一起,融合了他们各自的优点。

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;
}
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function() {
  console.log(this.age);
}

var instance1 = new SubType("Nicholas", 29);
var instance2 =new SubType("Greg", 27);
instance1.colors.push("black");
console.log(instance1.colors);    // red,blue,green,black
console.log(instance2.colors);    // red,blue,green
instance1.sayName();         // Nicholas
instance2.sayName();         // Greg
instance1.sayAge();           // 29
instance2.sayAge();           // 27

4.class继承

ES6中可以通过class创建对象,通过关键字extends继承。

class Point {
 constructor(x, y) {
  this.x = x;
  this.y = y;
 }
}

class ColorPoint extends Point {
 constructor(x, y, color) {
  this.color = color; // ReferenceError
  super(x, y);
  this.color = color; // 正确
 }
}

在ES6的继承中,子类一定要重写父类的构造函授的方法,否则会报错。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript getElementsByClassName函数
Apr 01 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
Mar 14 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
Jan 11 Javascript
js关闭父窗口时关闭子窗口
Apr 01 Javascript
Textarea根据内容自适应高度
Oct 28 Javascript
Node.js事件驱动
Jun 18 Javascript
javascript中获取元素标签中间的内容的实现方法
Oct 08 Javascript
基于jQuery实现的查看全文功能【实用】
Dec 11 Javascript
jQuery中each循环的跳出和结束实例
Aug 16 jQuery
jquery 验证用户名是否重复代码实例
May 14 jQuery
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
Sep 17 Javascript
TypeScript 运行时类型检查补充工具
Sep 28 Javascript
ES6 async、await的基本使用方法示例
Jun 06 #Javascript
JS 数组和对象的深拷贝操作示例
Jun 06 #Javascript
ES6 Generator基本使用方法示例
Jun 06 #Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
Jun 06 #jQuery
ES6 Symbol在对象中的作用实例分析
Jun 06 #Javascript
微信小程序多列表渲染数据开关互不影响的实现
Jun 05 #Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
Jun 05 #Javascript
You might like
PHP中几种常见的超时处理全面总结
2012/09/11 PHP
php set_time_limit()函数的使用详解
2013/06/05 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
php获取汉字拼音首字母的方法
2015/10/21 PHP
Discuz论坛密码与密保加密规则
2016/12/19 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
二级域名转向类
2006/11/09 Javascript
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
2015/04/24 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
2016/07/09 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
Vue router安装及使用方法解析
2020/12/02 Vue.js
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
Python入门之三角函数atan2()函数详解
2017/11/08 Python
rabbitmq(中间消息代理)在python中的使用详解
2017/12/14 Python
将Dataframe数据转化为ndarry数据的方法
2018/06/28 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
python Django编写接口并用Jmeter测试的方法
2019/07/31 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
2019/08/13 Python
Python内存映射文件读写方式
2020/04/24 Python
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
会计专业应届生求职信
2013/11/24 职场文书
房地产开盘策划方案
2014/02/10 职场文书
班委竞选演讲稿
2014/04/28 职场文书
2014年工程工作总结
2014/11/25 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python
使用SQL实现车流量的计算的示例代码
2022/02/28 SQL Server