JS继承方法
1、原型链:
每个构造函数都有一个原型对象,且有一个指针指向该原型对象(prototype),原型对象都包含一个指向构造函数的指针(constructor),而实例都包含一个指向原型对象的内部指针(proto)。若实例的原型是另一个构造函数的实例,该实例的原型有一个指向另一个原型的指针,层层递进,构成原型链。
原型上的属性和方法为所有实例所共有,当访问一个实例属性时,首先会在实例中搜索该属性,如果没有找到该属性,则会继续搜索该实例的原型,沿着原型链网上搜索,到原型链末端或找到为止。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 子类 function Sub(){ this .property = 'Sub Property' } Sub.prototype = new Super() // 注意这里new Super()生成的超类对象并没有constructor属性,故需添加上 Sub.prototype.constructor = Sub ```缺点: 1 . 包含引用类型的原型属性会被所有实例共享,一个实例对引用类型属性进行修改,就是直接修改原型上的该属性; 2 . 在创建子类型的实例时,没有办法给超类型的构造函数传递参数。 注意:原型上的引用值属性和方法使用时均为指针,但构造函数中的不同,不同实例中的同名属性和方法也不相同!!! |
2、借用构造函数:
1
2
3
4
5
|
在子类型构造函数中,使用call或apply方法在将来新建的对象上执行父类构造函数 function Sub(){ Super.call( this , '参数' ) //将Super的属性和方法都复制了一遍 this .property = 'Sub Property' } |
- 实例并不是父类的实例,只是子类的实例
- 只能继承父类的属性和方法,不能继承父类原型上的属性/方法
- 无法实现函数复用(父类上的方法也都复制到最后的实例中,方法不能复用),每个子类都有父类属性和方法的副本,影响性能
3、组合继承:
1
2
3
4
5
6
|
function Sub(){ Super.call( this ) //第二次调用Super() Super中的属性和方法复制进来 this.property = 'Sub Property' } Sub.prototype = new Super() //第一次调用Super() Super.prototype上的方法则可以共享 // 注意这里new Super()生成的超类对象并没有constructor属性,故需添加上 Sub.prototype.constructor = Sub |
4、原型式继承:
1
2
3
4
5
|
function objectCreate(obj){ function F(){} F.prototype = obj return new F() } |
5、寄生式继承:
1
2
3
4
5
6
7
8
9
10
|
function objectCreate(obj){ function F(){} F.prototype = obj return new F() } function createSubObj(superInstance){ var clone = objectCreate(superInstance) //任何能够返回新对象的函数都适用 clone.property = 'Sub Property' return clone } |
6、寄生组合式继承:
1
2
3
4
5
6
7
8
9
10
|
function inheritPrototype(Super,Sub){ var superProtoClone = Object.create(Super.prototype) superProtoClone.constructor = Sub Sub.prototype = Super } function Sub(){ Super.call() Sub.property = 'Sub Property' } inheritPrototype(Super,Sub) |
7、ES6 extends继承
类的实质是基于原型的和基于构造函数的语法糖
类声明:class 类名 {类体} ;//类声明不会提升
类表达式:let 类名 = class 类名 {类体}
extends 来创建子类,并继承父类 : class 子类名 extends 父类名 {类体}
1
|
class Point{ .... } typeof Point // "function" Point === Point.prototype.constructor // true |
类的数据类型就是函数,类本身就指向构造函数。
使用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致。
1
2
3
4
|
class Bar{ doStuff(){console.log( 'stuff' );} } var b = new Bar(); b.doStuff(); // "stuff" |
构造函数的prototype属性,在 ES6 的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype属性上面。
1
2
3
4
5
6
|
//定义类 class Point{ constructor((x, y){ this .x = x; this .y = y; } toString(){ return '(' + this .x + ', ' + this .y + ')' ; } } |
1
2
3
4
5
6
7
8
9
|
class ColorPoint extends Point { consturctor(x,y,color){ super (x,y); // 调用父类的constructor(x, y) this .color = color; } toString(){ return this .color + " " + super .toString(); //调用父类的toString()方法 } }
|
JS继承方法的更多相关文章
- js继承的方式及其优缺点
js继承方法 前因:ECMAScript不支持接口继承,只支持实现继承 一.原型链 概念:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针,让 ...
- JS继承(简单理解版)
童鞋们,我们今天聊聊js的继承,关于继承,平时开发基本用不到,但是面试没有不考的,我就想问,这是人干的事吗? 好吧,迫于社会主义核心价值观,我们今天就来简单说一说js的继承,谁让它是面向对象编程很重要 ...
- 各种实现js继承的方法总结
昨天主要介绍了原型,在js中,原型,原型链和继承是三个很重要的概念,而这几个概念也是面试中经常会被问到的问题,今天,就把昨天还没总结的原型链和继承继续做一个整理,希望大家一起学习,一起进步呀O(∩_∩ ...
- js oop中的三种继承方法
JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方 ...
- 实现JS继承的几种方法
总的来说,JS的继承大体上分为两种:借用构造函数方式和原型方式 首先,我们来看看借用构造函数方式的几种做法: //方式一function Person(name, sex){ this.name = ...
- JS中常见的几种继承方法
1.原型链继承 // 1.原型链继承 /* 缺点:所有属性被共享,而且不能传递参数 */ function Person(name,age){ this.name = name this.age = ...
- js各继承方法的优缺点
在js中有很多种继承的方法,下面总结这些方法的优缺点. ####1.原型链继承 优点: 非常纯粹的继承关系,实例是子类的实例,也是父类的实例 父类新增原型方法/原型属性,子类都能访问到 简单,易于实现 ...
- JS中的类,类的继承方法
大牛请无视此篇! 首先我们定义一个类,方法很简单,就像我们定义函数一样,只不过我们为了与函数区分,名称首字母要大写,看代码: function Person (){ } 这就是一个很简单的Poson类 ...
- JS继承的6种方法
1.原型链 基本思想:利用原型让一个引用类型继承另外一个引用类型的属性和方法. 构造函数,原型,实例之间的关系:每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针,而实例都包含一个指向原 ...
随机推荐
- ubuntu使用----高效快捷键
桌面快捷键 : ALT + F1: 聚焦到桌面左侧任务导航栏,可按上下键导航. ALT + F2: 运行命令 ALT + F4: 关闭窗口 ALT + TAB: 切换程序窗口 ALT + 空格: 打开 ...
- cocos2d-x开发:服务端基础库封装
元旦前面几天都在忙着面试,随后的几天也就一直在做服务端基础库开发方面的工作.对于服务端开发,是很久之前的事情了.那时候我还在大学读书,一直都是在倒腾服务端开发方面的东西,毕业后参加公司工作就是一直从事 ...
- 如何处理Entity Framework / Entity Framework Core中的DbUpdateConcurrencyException异常(转载)
1. Concurrency的作用 场景有个修改用户的页面功能,我们有一条数据User, ID是1的这个User的年龄是20, 性别是female(数据库中的原始数据)正确的该User的年龄是25, ...
- GitHub学生认证示范
打开网址:https://education.github.com/ 点击Get Your Pack 点击I am a Student 填写资料上传学生证照片,等待通过,如果没有GitHub账号就注 ...
- 将Spring容器跟随系统启动并获取容器对象
将Spring容器随系统启动的方法: 在web.xml中配置监听器,监听的对象为ContextLoaderListener <listener> <listener-class> ...
- Angular7教程-06-页面与数据交互
1. 本节说明 本节的内容会在上期搭建的框架基础上进行数据的填充,顺便回顾之前介绍过的插值表达式,属性绑定等知识,本节的数据只是在组件中模拟数据,后面会有专门的章节讲解如何从服务器获取数据. 2. 轮 ...
- mybatis的Mapper.xml文件SQL语句BadSqlGrammarException之FUNCTION错误系列
想必各位在开发过程中一定使用过:统计的功能,用到了很多SQL的函数,于是就直接写在Mapper文件中了: 比如: member_num,MAX(ID) AS newestLoanID,MIN (ID) ...
- vue项目获取当前地址栏参数(非路由传参)
项目中遇到一个需求,就是另一个管理系统带参直接单纯的跳转跳转到vue pc项目中的某个页面,后再初始化查询数据,参数以地址栏的形式传入 管理系统:打开新地址地址 let obj = { id: 21, ...
- javascript知识点杂记
for(var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); //输出10个10,因为setTimeout方法是异步 ...
- spring定时任务注解@Scheduled的记录
spring 定时任务@Scheduled 转自https://www.cnblogs.com/0201zcr/p/5995779.html 1.配置文件 <?xml version=" ...