前言: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. 依赖注入Bean属性——手动装配Bean

    一.构造方法注入 其中,可以根据不同的参数列表调用不同的重载的构造方法: 其中,基本数据类型没有包,引用类型都有包路径,基本类型对应封装类: 二.通过property标签调用类的set方法注入 三.通 ...

  2. 地址栏url中去掉所有参数

    1.地址栏url中去掉所有参数,这个是纯前端解决,很多时候页面跳转时候会选择在url后面带参数过去,(使用?&),方便传也方便取,但是我们要做的是不要让页面的一些请求参数暴露在外面 正常项目工 ...

  3. 记录不存在则插入,存在则更新 → MySQL 的实现方式有哪些?

    开心一刻 今天我爸.我.我女儿一起吃饭,我们每人一个鸡腿 女儿问道:爸爸,你吃鸡腿吗 我以为她要把她的鸡腿给我吃,倍感欣慰地说道:我不吃,宝贝 女儿一把抓起我的鸡腿放进了她爷爷的碗里,说道:不吃给爷爷 ...

  4. TP5更新数据成功,但判断结果不符

    thinkphp的CURD中,使用save方法时会出现一个奇怪的问题,即如果数据没有更新(与原数据相同),返回值判断为false.其实很久之前就发现了这个问题,一度以为是官方代码的问题,但是一直拖延到 ...

  5. Linux系列(4) - 目录处理命令(1)

    前言 linux中一切皆文件.目录为目录文件,普通文件用来保存数据,目录文件用来保存文件 建立目录:mkdir mkdir -p [目录名] -p 递归创建目录,例子:mkdir -p LinuxTe ...

  6. 在Ubuntu18.04安装docker之后,以登陆用户身份执行docker pull jenkins,报错:connect: permission denied

    Using default tag: latest Got permission denied while trying to connect to the Docker daemon socket ...

  7. phpmyadmin 设置密码

    例如 xampp 安装路径为 /opt/lampp/, copy 一份默认的配置 cp /opt/lampp/phpmyadmin/libraries/config.default.php /opt/ ...

  8. gitlab与git命令

    gitlab安装目录 /etc/gitlab#配置文件目录 /run/gitlab#运行pid目录 /opt/gitlab#安装目录 /var/opt/gitlab#数据目录 /var/log/git ...

  9. js 命令模式 组合模式

    * 基本宏命令 var closeDoorCommand = { execute: function() { console.log("Closing the door..."); ...

  10. vm 将宿主机文件夹 映射至 虚拟机

    一.关于centos如何安装(自行百度) 二.设置共享文件夹 添加共享文件夹(关闭虚拟机时操作) 虚拟机->设置->选项->共享文件夹 三.安装vm-tools (请用root用户执 ...