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 获取时间间隔实现代码
May 12 Javascript
jQuery ajax调用WCF服务实例
Jul 16 Javascript
jQuery实现文本框输入同步的方法
Jun 20 Javascript
jquery制作属于自己的select自定义样式
Nov 23 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
Nov 25 Javascript
基于javascript实现仿百度输入框自动匹配功能
Jan 03 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
Feb 13 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
Aug 19 Javascript
详解Immutable及 React 中实践
Mar 01 Javascript
了解JavaScript中的选择器
May 24 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
Sep 03 jQuery
在 Vue 中编写 SVG 图标组件的方法
Feb 24 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
php 时间计算问题小结
2009/01/04 PHP
php设计模式之命令模式的应用详解
2013/05/21 PHP
PHP简单检测网址是否能够正常打开的方法
2016/09/04 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
页面加载完毕后滚动条自动滚动一定位置
2014/02/20 Javascript
用jquery仿做发微博功能示例
2014/04/18 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
JavaScript变量声明详解
2014/11/27 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
Node.js+ES6+dropload.js实现移动端下拉加载实例
2017/06/01 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
JS 音频可视化插件Wavesurfer.js的使用教程
2018/10/31 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
[47:03]Ti4第二日主赛事败者组 LGD vs iG 2
2014/07/21 DOTA
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
RC4文件加密的python实现方法
2015/06/30 Python
Python找出list中最常出现元素的方法
2016/06/14 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
简单了解Python3里的一些新特性
2019/07/13 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
内科护士实习自我鉴定
2013/10/17 职场文书
工作时间擅自离岗检讨书
2014/10/24 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书