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 相关文章推荐
javascript 学习之旅 (2)
Feb 05 Javascript
jquery 回车事件实现代码
Aug 23 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
Apr 12 Javascript
18个非常棒的jQuery代码片段
Nov 02 Javascript
JS组件Bootstrap导航条使用方法详解
Apr 29 Javascript
jq stop()和:is(:animated)的用法及区别(详解)
Feb 12 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
Apr 10 jQuery
关闭Vue计算属性自带的缓存功能方法
Mar 02 Javascript
微信开发之企业付款到银行卡接口开发的示例代码
Sep 18 Javascript
解析JS在获取当前月的最后一天遇到的坑
Aug 30 Javascript
微信小程序页面滚动到指定位置代码实例
Sep 07 Javascript
JS typeof fn === 'function' && fn()详解
Aug 22 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新手上路(十四)
2006/10/09 PHP
mysql中存储过程、函数的一些问题
2007/02/14 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
php读取本地json文件的实例
2018/03/07 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
JS可以控制样式的名称写法一览
2014/01/16 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
js禁止Backspace键使浏览器后退的实现方法
2017/09/01 Javascript
vue+axios 前端实现的常用拦截的代码示例
2018/08/23 Javascript
Vue实现鼠标经过文字显示悬浮框效果的示例代码
2020/10/14 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
Pyhton中防止SQL注入的方法
2015/02/05 Python
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
python贪吃蛇游戏代码
2020/04/18 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
2020/05/27 Python
python语言中有算法吗
2020/06/16 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
python 利用matplotlib在3D空间中绘制平面的案例
2021/02/06 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
微软巴西官方网站:Microsoft Brasil
2019/09/26 全球购物
关键字throw与throws的用法差异
2016/11/22 面试题
应届生新闻编辑求职信
2013/11/19 职场文书
志愿者服务感言
2014/02/27 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
儿园租房协议书范本
2014/12/02 职场文书
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis
HTML常用标签超详细整理
2022/03/19 HTML / CSS