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 相关文章推荐
实现连缀调用的map方法(prototype)
Aug 05 Javascript
javascript分页代码(当前页码居中)
Sep 20 Javascript
js检查页面上有无重复id的实现代码
Jul 17 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
May 05 Javascript
JS+CSS实现滑动切换tab菜单效果
Aug 25 Javascript
探寻JavaScript中this指针指向
Apr 23 Javascript
JS正则表达式判断有效数实例代码
Mar 13 Javascript
Webpack 服务器端代码打包的示例代码
Sep 19 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
Aug 31 Javascript
three.js欧拉角和四元数的使用方法
Jul 26 Javascript
Vue+Element-U实现分页显示效果
Nov 15 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
Nov 17 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不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
PHP反射机制用法实例
2014/08/28 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
2015/05/13 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
PHP的自定义模板引擎
2017/03/24 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
js常用函数 不错
2006/09/08 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
JS声明变量背后的编译原理剖析
2012/12/28 Javascript
js网页中的(运行代码)功能实现思路
2013/02/04 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
JS不完全国际化&本地化手册 之 理论篇
2016/09/27 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
angularjs $http调用接口的方式详解
2018/08/13 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
js实现延迟加载的几种方法详解
2019/01/19 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
Javascript ParentNode和ChildNode接口原理解析
2020/03/16 Javascript
jQuery实现简单弹幕制作
2020/12/10 jQuery
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
手机使用python操作图片文件(pydroid3)过程详解
2019/09/25 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
浅谈HTML5 服务器推送事件(Server-sent Events)
2017/08/01 HTML / CSS
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
公司活动方案范文
2014/03/06 职场文书
环保倡议书300字
2014/05/15 职场文书
大学应届毕业生求职信
2014/05/24 职场文书
个人年度总结报告
2015/03/09 职场文书
新教师教学工作总结
2015/08/12 职场文书
SQL Server Agent 服务无法启动
2022/04/20 SQL Server