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打印网页部分内容的脚本
Nov 17 Javascript
JavaScript 三种创建对象的方法
Oct 16 Javascript
精通Javascript系列之数值计算
Jun 07 Javascript
JS的location.href跳出框架打开新页面的方法
Sep 04 Javascript
超炫的jquery仿flash导航栏特效
Nov 11 Javascript
JS触摸与手势事件详解
May 09 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
Jun 09 jQuery
vue修改vue项目运行端口号的方法
Aug 04 Javascript
JS处理一些简单计算题
Feb 24 Javascript
Vue动态加载异步组件的方法
Nov 21 Javascript
js实现图片3D轮播效果
Sep 21 Javascript
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
Apr 06 Vue.js
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/07/13 PHP
php实现QQ空间获取当前用户的用户名并生成图片
2015/07/25 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
js 验证密码强弱的小例子
2013/03/21 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
微信小程序 网络请求(GET请求)详解
2016/11/16 Javascript
探讨AngularJs中ui.route的简单应用
2016/11/16 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
Layui点击图片弹框预览的实现方法
2019/09/16 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
Python help()函数用法详解
2014/03/11 Python
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
python概率计算器实例分析
2015/03/25 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
Html5元素及基本语法详解
2016/08/02 HTML / CSS
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
国际贸易个人求职信范文
2014/01/04 职场文书
2014三八妇女节活动总结
2014/03/01 职场文书
交通文明倡议书
2014/05/16 职场文书
外联部演讲稿
2014/05/24 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
场地使用证明模板
2014/10/25 职场文书
工作时间证明
2015/06/15 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
pycharm代码删除恢复的方法
2021/06/26 Python