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 相关文章推荐
jquery 表单下所有元素的隐藏
Jul 25 Javascript
海量经典的jQuery插件集合
Jan 12 Javascript
JavaScript 类似flash效果的立体图片浏览器
Feb 08 Javascript
js 强制弹出窗口代码研究-又一款代码
Mar 20 Javascript
javascript 日期时间 转换的方法
Feb 21 Javascript
javascript打印大全(打印页面设置/打印预览代码)
Mar 29 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
Aug 09 Javascript
jQuery获得指定元素坐标的方法
Apr 14 Javascript
AngularJS 2.0新特性有哪些
Feb 18 Javascript
Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#‘的解决方法
Jun 17 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
Jul 11 jQuery
javascript设计模式 ? 装饰模式原理与应用实例分析
Apr 14 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实现大数(浮点数)取余的方法
2017/02/18 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
jQuery 数据缓存data(name, value)详解及实现
2010/01/04 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
2017/01/18 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
捕获未处理的Promise错误方法
2017/10/13 Javascript
jQuery/JS监听input输入框值变化实例
2019/10/17 jQuery
JS+JQuery实现无缝连接轮播图
2020/12/30 jQuery
[01:18:21]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
在Python中操作时间之mktime()方法的使用教程
2015/05/22 Python
Python基于scapy实现修改IP发送请求的方法示例
2017/07/08 Python
python实现月食效果实例代码
2019/06/18 Python
Ubuntu+python将nii图像保存成png格式
2019/07/18 Python
python实现简单成绩录入系统
2019/09/19 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
Django实现celery定时任务过程解析
2020/04/21 Python
智利最大的网上商店:Linio智利
2016/11/24 全球购物
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
.NET程序员的数据库面试题
2012/10/10 面试题
博士学位自我鉴定范文
2013/12/26 职场文书
项目投资建议书
2014/05/16 职场文书
实习协议书范本
2014/09/25 职场文书
教育教学工作反思
2016/02/24 职场文书
2016年党员创先争优承诺书
2016/03/25 职场文书
Python中X[:,0]和X[:,1]的用法
2021/05/10 Python