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 09 Javascript
jquery点击切换背景色的简单实例
Aug 25 Javascript
模板视图和AngularJS之间冲突的解决方法
Nov 22 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
Dec 21 Javascript
jquery PrintArea 实现票据的套打功能(代码)
Mar 17 Javascript
JavaScript注册时密码强度校验代码
Jun 30 Javascript
postman+json+springmvc测试批量添加实例
Mar 31 Javascript
详解vue挂载到dom上会发生什么
Jan 20 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
Apr 20 Javascript
微信小程序rich-text富文本用法实例分析
May 20 Javascript
layui的表单提交以及验证和修改弹框的实例
Sep 09 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
Aug 11 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代码判断设备是手机还是平板电脑(两种方法)
2015/10/19 PHP
PHP实现清除wordpress里恶意代码
2015/10/21 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
2016/06/13 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
用htc组件制作windows选项卡
2007/01/13 Javascript
js left,right,mid函数
2008/06/10 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
2017/02/15 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
BootStrap 标题设置跨行无效的解决方法
2017/10/25 Javascript
Parcel 打包示例(React HelloWorld)
2018/01/16 Javascript
vue 实现类似淘宝星级评分的示例
2018/03/01 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
Python有序查找算法之二分法实例分析
2017/12/11 Python
Django自定义manage命令实例代码
2018/02/11 Python
python 用所有标点符号分隔句子的示例
2019/07/15 Python
Pyecharts绘制全球流向图的示例代码
2020/01/08 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
python 装饰器重要在哪
2021/02/14 Python
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
自我鉴定四大框架
2014/01/17 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
小学教师见习总结
2015/06/23 职场文书
培训简讯范文
2015/07/20 职场文书
FP-growth算法发现频繁项集——构建FP树
2021/06/24 Python
详解JS数组方法
2021/11/20 Javascript
详解Vue中$props、$attrs和$listeners的使用方法
2022/02/18 Vue.js
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs