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 相关文章推荐
[原创]js获取数组任意个不重复的随机数组元素
Mar 15 Javascript
JQuery select标签操作代码段
May 16 Javascript
js报错 Object doesn't support this property or method的原因分析
Mar 31 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
Oct 12 Javascript
jquery实现图片翻页效果
Dec 23 Javascript
jQuery异步获取json数据方法汇总
Dec 22 Javascript
javascript获取四位数字或者字母的随机数
Jan 09 Javascript
js+html5生成自动排列对话框实例
Oct 09 Javascript
vue-cli webpack2项目打包优化分享
Feb 07 Javascript
mockjs+vue页面直接展示数据的方法
Dec 19 Javascript
微信小程序点击item使之滚动到屏幕中间位置
Mar 25 Javascript
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
Aug 05 Vue.js
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
提问的智慧
2006/10/09 PHP
PHP通用检测函数集合
2006/11/25 PHP
基于php冒泡排序算法的深入理解
2013/06/09 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
jQuery选择器特殊字符与属性空格问题
2017/08/14 jQuery
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
原生JavaScript实现的无缝滚动功能详解
2020/01/17 Javascript
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
Python Trie树实现字典排序
2014/03/28 Python
python3中int(整型)的使用教程
2017/03/23 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
Python多进程池 multiprocessing Pool用法示例
2018/09/07 Python
对Python信号处理模块signal详解
2019/01/09 Python
Python 监测文件是否更新的方法
2019/06/10 Python
Python函数基本使用原理详解
2020/03/19 Python
jupyter notebook 多行输出实例
2020/04/09 Python
如何安装并在pycharm使用selenium的方法
2020/04/30 Python
基于Keras的格式化输出Loss实现方式
2020/06/17 Python
CSS3使用多列制作瀑布流
2016/05/10 HTML / CSS
如何利用CSS3制作3D效果文字具体实现样式
2013/05/02 HTML / CSS
HTML5 新事件 小结
2009/07/16 HTML / CSS
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
毕业生自荐书模版
2014/01/04 职场文书
2014办公室年度工作总结
2014/12/09 职场文书
爱国主义主题班会
2015/08/14 职场文书