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与CSS写在同一个文件里的书写方法
Jun 02 Javascript
node.js 动态执行脚本
Jun 02 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
Jul 28 Javascript
jQuery实现自动输入email、时间和域名的方法
Aug 24 Javascript
快速解决js开发下拉框中blur与click冲突
Oct 10 Javascript
详解node child_process模块学习笔记
Jan 24 Javascript
微信小程序开发背景图显示功能
Aug 08 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
Oct 10 Javascript
vue日历/日程提醒/html5本地缓存功能
Sep 02 Javascript
vue-socket.io接收不到数据问题的解决方法
May 13 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
Aug 04 Javascript
微信小程序实现简单的select下拉框
Nov 23 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开发环境配置记录
2011/01/14 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
PHP的伪随机数与真随机数详解
2015/05/27 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
firefox firebug中文入门教程 脚本之家新年特别版
2010/01/02 Javascript
jQuery实现伸展与合拢panel的方法
2015/04/30 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
js模仿java的Map集合详解
2016/01/06 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
基于匀速运动的实例讲解(侧边栏,淡入淡出)
2017/10/17 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
解决layui-table单元格设置为百分比在ie8下不能自适应的问题
2019/09/28 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
2020/08/17 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
python中from module import * 的一个坑
2014/07/20 Python
在Python中操作字符串之replace()方法的使用
2015/05/19 Python
python读写json文件的简单实现
2017/04/11 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
Django进阶之CSRF的解决
2018/08/01 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
python 调用钉钉机器人的方法
2019/02/20 Python
python中几种自动微分库解析
2019/08/29 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
Python3 实现减少可调用对象的参数个数
2019/12/20 Python
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
劳动竞赛口号
2014/06/16 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS
Python+Matplotlib+LaTeX玩转数学公式
2022/02/24 Python