JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一。

继承:子承父业;一个原本没有某些方法或属性的对象,统一写方法,拿到了另外一个对象的属性和方法

下面是js中的几种继承方式

1.改变this指向继承(构造函数继承):继承构造函数中的属性和方法

 function Parent(n){
this.name = n;
this.skill = function(){
console.log(this.name + "是篮球运动员"); //樱木花道是篮球运动员
//泽北荣治是篮球运动员
}
}
Parent.prototype.init = function(){
console.log(123) //123
} // function P2(){
// this.a = 10;
// }
// function P3(){
// this.b = 20;
// }
// function P4(){
// this.c = 30;
// } function Child(n){
// Parent.bind(this,n)();
// P2.bind(this)()
// P3.bind(this)()
// P4.bind(this)() // Parent.call(this,n); Parent.apply(this,arguments);
} var p = new Parent("樱木花道");
console.log(p)
p.skill(); //
p.init() var c = new Child("泽北荣治");
console.log(c)
c.skill(); //
// console.log(c.a)
// console.log(c.b)
// console.log(c.c)
// c.init()

优点:简单方便易操作,可以多继承

缺点:只能继承构造函数,不能继承原型

2.原型对象继承:继承原型

function Parent(n){
this.name = n;
}
Parent.prototype.skill = function(){
console.log(this.name + "是鉴定师"); //大老王是鉴定师
//小老王是鉴定师
} function Child(n){
this.name = n;
} // 注意:对象的深浅拷贝
for(var i in Parent.prototype){
Child.prototype[i] = Parent.prototype[i];
} var p = new Parent("大老王");
console.log(p) //Parent {name: "大老王"}
p.skill(); var c = new Child("小老王");
console.log(c) //Child {name: "小老王"}
c.skill();

优点:简单,方便,可以继承原型身上的方式和属性

缺单:只能继承原型,不方便传参

3.原型链继承:通过给Child设置原型为Parent的实例的方式,给Child添加了一层原型链的方式

 function Parent(n){
this.name = n;
}
Parent.prototype.skill = function(){
console.log(this.name + "是鉴定师"); //大老王是鉴定师
} function Child(){}
Child.prototype = new Parent("小老王"); Child.prototype.skill = function(){
console.log(this.name+"是运动员") //小老王是运动员
} var p = new Parent("大老王");
console.log(p) //Parent {name: "大老王"}
p.skill();
// p是实例(对象),有__proto__属性,指向Parent.prototype var c = new Child();
console.log(c); //Child {}
c.skill();
// c是实例(对象),有__proto__属性,指向Child.prototype,是Parent的实例(对象),有__proto__属性,指向Parent.prototype

优点:既能继承原型,又能继承构造函数

缺点:复杂,不方便传参

4.混合继承:构造函数继承+原型对象继承

 function Parent(n){
this.name = n;
}
Parent.prototype.skill = function(){
console.log(this.name + "是鉴定师"); //大老王是鉴定师
} function P2(){
this.a = 10;
}
P2.prototype.init = function(){
console.log("hello") //hello
} function Child(n){
Parent.call(this,n)
P2.call(this)
}
for(var i in Parent.prototype){
Child.prototype[i] = Parent.prototype[i]
}
for(var i in P2.prototype){
Child.prototype[i] = P2.prototype[i]
} Child.prototype.skill = function(){
console.log(123) //123
} var p = new Parent("大老王");
console.log(p) //Parent {name: "大老王"}
p.skill(); var c = new Child("小老王");
console.log(c) //Child {name: "小老王", a: 10}
c.skill();
c.init();

优点:既能继承构造函数又能继承原型,方便传参,多继承

缺点:复杂

常用的继承方式之一

5.ES6的class继承

class Parent{
constructor(n) {
this.name = n
}
skill(){
console.log(this.name + "是鉴定师") //大老王是鉴定师
//小老王是鉴定师
}
} class Child extends Parent{
constructor(n){
super(n)
}
} var p = new Parent("大老王");
console.log(p) //Parent {name: "大老王"}
p.skill(); var c = new Child("小老王"); //Child {name: "小老王"}
console.log(c)
c.skill();

优点:简单方便易操作,语法层面的继承,属性和方法都能继承,参数很好处理

缺点:兼容性

忽略兼容,常用的继承方式之一

js中的几种继承方法的更多相关文章

  1. js oop中的三种继承方法

    JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方 ...

  2. JS中的五种去重方法

    JS中的五种去重方法 第一种方法: 第二种方法:  第三种方法: 第四种方法: 第五种方法:优化遍历数组法 思路:获取没重复的最右一值放入新数组 * 方法的实现代码相当酷炫,* 实现思路:获取没重复的 ...

  3. JS中的两种刷新方法以及区别和适用范围

    在项目中有一个人信息修改的页面,但是修改后显示的却是修改之前的内容,分析问题后发现查询语句写在了修改语句之前,有些某些需要又必须这么写,但是修改信息后先却显示之前的信息也太不科学了. 所以我就想用js ...

  4. 事件委托,js中的一种优化方法

    在前端编程中,我们常会遇到一种叫做事件委托的方法. 那么, 什么是事件委托呢? 简单来说,事件就是指onclick,onmouseover,onmouseout等大部分事件,为什么说是大部分后面会提到 ...

  5. JS中常见的几种继承方法

    1.原型链继承 // 1.原型链继承 /* 缺点:所有属性被共享,而且不能传递参数 */ function Person(name,age){ this.name = name this.age = ...

  6. js中的原型、继承的一些想法

    最近看到一个别人写的js类库,突然对js中的原型及继承产生了一些想法,之前也看过其中的一些内容,但是总不是很清晰,这几天利用空闲时间,对这块理解了一下,感觉还是有不通之处,思路上没那么条理,仅作为分享 ...

  7. 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解

    提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以 ...

  8. 详解js中的寄生组合式继承

    寄生组合式继承是js中最理想的继承方式, 最大限度的节省了内存空间. js中的寄生组合式继承要求是: 1.子对象有父对象属性的副本, 且这些不应该保存在子对象的prototype上.       2. ...

  9. JavaScript -- 时光流逝(三):js中的 String 对象的方法

    JavaScript -- 知识点回顾篇(三):js中的 String 对象的方法 (1) anchor(): 创建 HTML 锚. <script type="text/javasc ...

随机推荐

  1. SpringDataJpa在一对多、多对多关系映射时出现StackOverflowError

    在使用spring-data-jpa时,进行一对多配置后,在调用save方法时,出现内存溢出. 产生原因一:为了方便看信息,在两类中分别重写了 toString 方法,导致查询加载时两类在互相调用对方 ...

  2. Python爬虫视频教程

    ├─第1章_[第0周]网络爬虫之前奏 │ ├─第1节_"网络爬虫"课程内容导学 │ │ 第1部分_全课程内容导学.mp4 │ │ 第2部分_全课程内容导学(WS00单元)学习资料. ...

  3. idea2019.2安装指南

    先去官网下载idea官网地址 下载UItimate版本点击 DOWNLOAD等待下载完成 点击ideaIU-2019.2.exe一路next      可以在这一步选一下 继续next         ...

  4. windows安装nginx、mysql等软件并加入系统服务启动详细

    windows类系统安装nginx.mysql软件 (PS:windows系统环境中设置完nginx.mysql环境变量,需要重新启动系统才会生效.) 一.NGINX:首先下载windows版ngin ...

  5. vs中代码的发行以及图标的添加

    发布代码,将Debug改成Release 在属性代码生成中找到运行库将多线程MD改成MT应用(使文件适用于普遍的电脑) 重新生成解决方案然后就可以在项目文件夹中找到Release底下的.exe文件(可 ...

  6. 并查集(不相交集合)详解与java实现

    目录 认识并查集 并查集解析 基本思想 如何查看a,b是否在一个集合? a,b合并,究竟是a的祖先合并在b的祖先上,还是b的祖先合并在a上? 其他路径压缩? 代码实现 结语 @(文章目录) 认识并查集 ...

  7. C笔记_常用快捷键

    1.第一部分 Ctrl + up/down 以光标所在行为中心上下移动文本: Ctrl + left/right 左右跳过一个单词或符号: Ctrl + end 跳至文本末尾: Ctrl + dele ...

  8. CSU1784

    题意略. 思路:为了更好地求出一段连续数字的异或和,我们可以用前缀异或和来维护,现在我们只需要考虑每一个在数组中的数字向前异或,且在指定范围内, 异或值为全1的个数有多少个.算出每一个位子能做出的贡献 ...

  9. 一文搞懂transform: skew

    如何理解斜切skew,先看一个demo.在下面的demo中,有4个正方形,分别是 红色:不做skew变换, 绿色:x方向变换, 蓝色:y方向变换, 黑色:两个方向都变换, 拖动下面的滑块可以查看改变s ...

  10. Spring Cloud Alibaba | Nacos动态网关路由

    Spring Cloud Alibaba | Gateway基于Nacos动态网关路由 本篇实战所使用Spring有关版本: SpringBoot:2.1.7.RELEASE Spring Cloud ...