前言:es6之前在js中要实现继承,就必须要我们程序员在原型链上手动继承多对象的操作,但是结果往往存在漏洞,为解决这些问题,社区中出现了盗用构造函数、组合继承、原型式继承、寄生式继承等一系列继承方式,这都需要程序员对原型链有深入的认识。但是当es6出现,class关键字便一并将继承问题完美解决,且大大降低程序员的学习成本,只需要使用轮子即可。本文将会展开对类继承叙述。

一、类的继承基础

  在类中实现继承,需要使用关键字extends,使用之后就可以继承任何拥有[[constructor]]和原型的对象。这也就意味着使用extends,不止可以继承另一个类,同时也可以继承普通构造函数。

 1 class Car{
2
3 }
4 class MyCar extends Car{
5
6 }
7 const firstCar = new MyCar();
8
9 console.log (firstCar instanceof Car); //true
10 console.log (firstCar instanceof MyCar); //true
11
12 function Person (){
13
14 }
15 class P1 extends Person{
16
17 }
18 const p = new P1();
19 console.log (p instanceof P1); //true
20 console.log (p instanceof Person); //true

  在类和原型上定义的方法会被带到派生类(继承对象的对象)上。

 1 class Car{
2 // 定义getName到Car原型上
3 getName(){
4 console.log (this);
5 }
6 // 定义setName到Car类自身上
7 static setName(){
8 console.log (this);
9 }
10 }
11 class MyCar extends Car{
12
13 }
14 const a = new Car;
15 const b = new MyCar();
16
17 a.getName(); //Car {}
18 b.getName(); //MyCar {}
19
20 Car.setName(); //class Car{}
21 MyCar.setName(); //class MyCar extends Car{}

二、构造函数与super()

  派生类的方法可以通过super()关键字以实现原型的引用,原因在于super会调用父类构造函数,相当于super.constructor()。

 1 class Person{
2 constructor(){
3 this.name = 'test'
4 }
5 }
6 class P1 extends Person{
7 constructor(){
8 super();
9 console.log (this.name);
10 }
11 }
12 new P1;

  定义在父类上的静态方法也可以通过super调用继承类上定义的静态方法。

  但是使用super时需要注意以下几点:

  1. super只能在派生类的构造函数和静态方法中使用
  2. 不能单独使用super,要么用来调用构造函数,要么用来引用静态方法
  3. 调用super()会调用父类构造函数,并将返回的实例赋值给this
  4. 在类构造函数中,不能在调用调用super()之前引用this

三、抽象基类

  抽象基类可以用于在定义一个类时只需要供其他类继承而本身不用实例化的情况。

  要实现抽象基类需要通过new.target,new.target保存通过new关键字调用的类或函数。

 1 class Person{
2 constructor(){
3 //如果使用Person直接进行实例化会抛出错误
4 if(new.target === Person){
5 throw 'Person can,t be instantiated'
6 }
7 }
8 }
9 class P extends Person{
10
11 }
12 new P;
13 // new Person; 注释解开会导致报错

四、继承内置类型

  es6之后,开发者可以通过类继承,轻松扩展内置类型。

 1 // NewArray继承于Array,且扩展了Array属性
2 class NewArray extends Array{
3 // 洗牌算法
4 shuffle(){
5 for(let i = this.length-1;i>0;i--){
6 const j = Math.floor(Math.random()*(i+1));
7 [this[i],this[j]] = [this[j],this[i]];
8 }
9 }
10 }
11 let a = new NewArray(1,2,3,4,5);
12 console.log (a instanceof Array); //true
13 console.log (a instanceof NewArray); //true
14 console.log (a); //NewArray(5) [1, 2, 3, 4, 5]
15 a.shuffle();
16 console.log (a); //NewArray(5) [1, 4, 2, 3, 5]

javascriptRemke之类的继承的更多相关文章

  1. javaScript的原型继承与多态性

    1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...

  2. JavaScript的继承实现方式

    1.使用call或apply方法,将父对象的构造函数绑定在子对象上 function A(){ this.name = 'json'; } function B(){ A.call(this); } ...

  3. javascript中的继承与深度拷贝

    前言 本篇适合前端新人,下面开始...... 对于前端新手来说(比如博主),每当对js的对象做操作时,都是一种痛苦,原因就是在于对象的赋值是引用的传递,并非值的传递,虽然看上去后者赋值给了前者,他们就 ...

  4. 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  5. JS继承类相关试题

    题目一: //有关于原型继承的代码如下:function Person(name) {   this.name = name;}Person.prototype = {     getName : f ...

  6. JS继承之寄生类继承

    原型式继承 其原理就是借助原型,可以基于已有的对象创建新对象.节省了创建自定义类型这一步(虽然觉得这样没什么意义). 模型 function object(o){ function W(){ } W. ...

  7. JS继承之借用构造函数继承和组合继承

    根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...

  8. JS继承之原型继承

     许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...

  9. 深入浅出JavaScript之原型链&继承

    Javascript语言的继承机制,它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instanc ...

随机推荐

  1. inotify与rsync实现实时同步记录文档

    目录 安装 配置 参考链接 安装 安装rsync yum -y install rsync 安装inotify-tools 这是一个实时监听文件变换的工具 wget -O /etc/yum.repos ...

  2. mysqli的基本使用

    简单实例 面向过程方式 // 创建数据库连接 $connect = mysqli_connect('127.0.0.1', 'root', 'root', 'test', 8889); // 判读是否 ...

  3. Shiro03

    1.shiro授权角色.权限 2.Shiro的注解式开发 shiro权限思路 授权 ShiroUserMapper中定义两个方法 // 通过用户ID查询角色 Set<String> get ...

  4. Python - 通过PyYaml库操作YAML文件

    PyYaml简单介绍 Python的PyYAML模块是Python的YAML解析器和生成器 它有个版本分水岭,就是5.1 读取YAML5.1之前的读取方法 def read_yaml(self, pa ...

  5. 安装 Ubuntu 21.04 后必备的绝佳应用大合集(持续更新中)

    @ 目录 一.Google Chrome 浏览器 1.下载 2.安装 3.设置搜索引擎 二.火焰截图(替代QQ截图) 1.简介: 2.安装: 3.设置快捷键: 三.VLC视频播放器(替代Potplay ...

  6. C# List集合类常用操作:三、查找

    List集合查询数据 List<Employees> employees = new List<Employees>(); employees.Add(new Employee ...

  7. python库--pandas--Series

    方法 返回数据类型 参数 说明 Series(一维)       .Series() Series 实例s 创建一维数据类型Series data=None 要转化为Series的数据(也可用dict ...

  8. Pikachu靶场通关之XSS(跨站脚本)

    一.XSS(跨站脚本)概述 Cross-Site Scripting 简称为"CSS",为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS.一般XSS可以 ...

  9. Webpack的配置项

    Webpack配置选项 ​ 经历了考研以后,接下来的时间里准备捡起来这些以前学的东西,并且继续向着前端的方向出发,给自己多一条路的选择.话不多说,直接开始. moudule.exports = { / ...

  10. TP5用join进行查询出来后的循环id都是一样的

    这是因为join将两个表的所有字段都查询,id冲突了,所以需要设置名,或指定选择一个表的id 用field('a.*')