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. Kafka之Producer

    通过https://www.cnblogs.com/tree1123/p/11243668.html 已经对consumer有了一定的了解.producer比consumer要简单一些. 一.旧版本p ...

  2. R 实用命令 1

    Quit and restart a clean R session from within R? If you're in RStudio: command/ctrl + shift + F10 . ...

  3. 写个shell脚本搭载jenkins让你的程序部署飞起来

    [转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11399251.html    作者:jstarseven    码字挺辛苦的.....  说明 ...

  4. 使用注解的Hibernate one-to-many映射

    One to many映射关系指的是两个实体间一个实体可以和多个实体有关联关系,但是多的这一端只能和一的这一端的一个实例有关系.它是一个1 到 n的关系.例如在任何的公司员工可以注册多个银行账户,一个 ...

  5. 部署Kettle做ETL开发并使用Crontab制作调度系统

    背景说明: 在数据量较小,且数据源和装载地都是关系型数据库时,使用Kettle做ETL较为简便. 由于调度系统产品因为服务器环境方面的因素,而无法部署,故使用Linux的crontab定时器来制作简易 ...

  6. Fastjson反序列化漏洞概述

    Fastjson反序列化漏洞概述 ​ 背景 在推动Fastjson组件升级的过程中遇到一些问题,为帮助业务同学理解漏洞危害,下文将从整体上对其漏洞原理及利用方式做归纳总结,主要是一些概述性和原理上的东 ...

  7. netty源码解解析(4.0)-20 ChannelHandler: 自己实现一个自定义协议的服务器和客户端

    本章不会直接分析Netty源码,而是通过使用Netty的能力实现一个自定义协议的服务器和客户端.通过这样的实践,可以更深刻地理解Netty的相关代码,同时可以了解,在设计实现自定义协议的过程中需要解决 ...

  8. .NET Core 学习资料精选:进阶

    .NET 3.0 这个月就要正式发布了,对于前一篇博文<.NET Core 学习资料精选:入门>大家学的可还开心?这是本系列的第二篇文章:进阶篇,喜欢的园友速度学起来啊. 对于还在使用传统 ...

  9. Java内部类使用注意事项

    Java内部类使用注意事项: 1. 非静态内部类成员可以访问外部类实例成员 (如注释1),但外部类访问非静态内部类的成员 必须创建非静态内部类对象来访问其成员,如注释2 public class La ...

  10. Features Track 2018徐州icpc网络赛 思维

    Morgana is learning computer vision, and he likes cats, too. One day he wants to find the cat moveme ...