ECMAScript 6中类继承解析(附示例)

本篇文章给大家带来的内容是关于ecmascript 6中类继承解析(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

类继承

看类继承前,先回顾构造函数怎么实现对象的继承的

        function F() {            this.a = 1;        }        function Son() {            F.call(this);        }         function inherit(S, F) {            S.prototype = Object.create(F.prototype);            S.prototype.constructor = S;        }        inherit(Son, F);        let son = new Son();

登录后复制

它实现了哪几个功能:

继承F的this属性也就是F实例对象的属性

Son.prototype.__proto__ === F.prototype 实现了上下辈分的继承

son.constructor让son认祖归宗

同样类继承也是如此

用来extends和super关键字,看一个简单的继承

        class A {            constructor() {                this.a = 1;            }        }        class B extends A {            constructor() {                super();                this.b = 2;            }            m() {            }        }        let b = new B();

登录后复制

同样实现了那三点基本功能

B {a: 1, b: 2}b.__proto__  == B.prototypeb.__proto__.__proto__ === A.prototypeb.constructor === B

登录后复制

我认为:关键字extends实现了原型的继承,以及constructor的修正;关键字super实现了父类this的继承,这里的super相当于A.prototype.constructor.call(this)

注意点

写了constructor,就必须在里面写super,不然new子类实例对象会报错;要么都不写;其次子类的中constructor中的this属性必须写在super后面

1.ES5 的继承,实质是先创造子类的实例对象this,然后再将父类的方法添加到this上面(Parent.apply(this))。ES6 的继承机制完全不同,实质是先将父类实例对象的属性和方法,加到this上面(所以必须先调用super方法),然后再用子类的构造函数修改this
2.因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实    例属性和方法。如果不调用super方法,子类就得不到this对象。

        class B extends A {            constructor() {    //要么都不写,new时默认会自动生成                super();                this.b = 2;    //写在super后面            }             m() {            }        }

登录后复制

super的各种指向问题

super作为函数,只能放在子类的constructor中,指向A.prototype.constructor.call(this)

super作为对象,在子类普通方法中调用,super就是父类的原型也就是A.prototype;所以只能调用原型链上的方法,不能动用父类实例的方法和属性constructor{}中的不能调用

        class A {            constructor() {                this.a = 1;            }            n() {                return this;            }        }        class B extends A {            constructor() {                                super();                this.b = 2;                            }            m() {                return super.n();            }        }        let b = new B();        b === b.m();

登录后复制

并且规定

在子类普通方法中通过super调用父类的方法时,方法内部的this指向当前的子类实例。

所以上面return this 就是返回子类实例对象

super作为对象对属性赋值时
super相当于this,赋值属性也就成了子类实例的属性

class A {  constructor() {    this.x = 1;  }}class B extends A {  constructor() {    super();    this.x = 2;    super.x = 3;    console.log(super.x); // undefined    console.log(this.x); // 3    console.log(super.valueOf() instanceof B);   //true  }}let b = new B();

登录后复制

super作为对象,在静态方法中指向的是父类能调用父类的静态方法,如果方法内部有this则指向当前的子类
只有类才能调用类的静态方法

        class A {            constructor() {                this.a = 1;            }            static n() {                return this;            }        }        class B extends A {            constructor() {                                super();                this.b = 2;                            }            static m() {                return super.n();            }        }        console.log(A.n() === A)   // true        console.log(B === B.m());  //true

登录后复制由于对象总是继承其他对象的,所以可以在任意一个对象中,使用super关键字。

var obj = {  toString() {    return "MyObject: " + super.toString();  }};Object.getPrototypeOf(obj).toString = function () {    return "这里super等于obj.__proto__";}console.log(obj.toString());        //MyObject: 这里super等于obj.__proto__

登录后复制

类的prototype与__proto__

(1)子类的__proto__属性,表示构造函数的继承,总是指向父类。

(2)子类prototype属性的__proto__属性,表示方法的继承,总是指向父类的prototype属性。

类的继承模式

class A {}class B {}// B 的实例继承 A 的实例Object.setPrototypeOf(B.prototype, A.prototype);// B 继承 A 的静态属性Object.setPrototypeOf(B, A);const b = new B();

登录后复制

也是因为这种实现所以类能调用自己的静态方法

es6实现了原始构造函数的继承

之前Array.apply(this)this并不会塑造Array里面的内部结构,所以我们当我们用类数组对象引用数组方法时用null代替了
而es6用类实现它的继承,
代码摘自es6入门

class MyArray extends Array {  constructor(...args) {    super(...args);  }}var arr = new MyArray();arr[0] = 12;arr.length // 1arr.length = 0;arr[0] // undefined

登录后复制

需要注意的是

ES6 改变了Object构造函数的行为,一旦发现Object方法不是通过new Object()这种形式调用,ES6 规定Object构造函数会忽略参数。

class NewObj extends Object{  constructor(){    super(...arguments);  }}var o = new NewObj({attr: true});o.attr === true  // false

登录后复制

传入参数会无效的

以上就是ECMAScript 6中类继承解析(附示例)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2738056.html

(0)
上一篇 2025年3月8日 01:44:29
下一篇 2025年2月27日 03:35:20

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • ES6的Symbol的用法详解(附代码)

    本篇文章给大家带来的内容是关于es6的symbol的用法详解(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、Symbol是ES6新增的数据类型,它提供独一无二的值 { // 声明,Symbol声明的变量是唯一…

    编程技术 2025年3月8日
    000
  • javascript函数表达式的特征以及递归的理解(附示例)

    本篇文章给大家带来的内容是关于javascript函数表达式的特征以及递归的理解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 函数表达式是javascript中的一个既强大又容易令人困惑的特性。 定义函数的方式…

    编程技术 2025年3月8日
    200
  • 对es6中类的简单理解(附示例)

    本篇文章给大家带来的内容是关于对es6中类的简单理解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 类class 基本概念,记录以便自己后面加深理解 了解类是什么 class是什么?不妨写一个看看 class D…

    编程技术 2025年3月8日
    200
  • ES6下异步处理的实例讲解

    本篇文章给大家带来的内容是关于es6下异步处理的实例讲解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 前言 我们以查找指定目录下的最大文件为例,感受从 回调函数 -> Promise -> Generator…

    编程技术 2025年3月8日
    200
  • ajax-plus的使用方法介绍(代码)

    本篇文章给大家带来的内容是关于ajax-plus的使用方法介绍(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 ajax-plus 基于axios 的 Vue 插件 如何使用 npm 模块引入 首先通过 npm 安装…

    编程技术 2025年3月8日
    200
  • CommonJS规范是什么?了解CommonJS规范

    本篇文章给大家带来的内容是关于commonjs规范是什么?了解commonjs规范,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 写在前面:  一个文件就是一个模块。   另外本文中的示例代码需要在node.js环境中方可…

    编程技术 2025年3月8日
    200
  • 为什么需要模块化?js中常用模块化方案介绍

    本篇文章给大家带来的内容是关于为什么需要模块化?js中常用模块化方案介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 为什么需要模块化 在ES6出现之前,JS语言本身并没有提供模块化能力,这为开发带来了一些问题,其中最重…

    编程技术 2025年3月8日
    200
  • 通过封装一个v-clamp的指令处理多行文本的溢出

    本篇文章给大家带来的内容是关于通过封装一个v-clamp的指令处理多行文本的溢出,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 最近做项目时,遇到了一个需求:要求div里文本在两行显示,div的宽度是固定的,如果溢出的话就…

    编程技术 2025年3月8日
    200
  • es7中修饰器(Decorator)的详解(附示例)

    本篇文章给大家带来的内容是关于es7中修饰器(decorator)的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1. Decorator基本知识 在很多框架和库中看到它的身影,尤其是React和Redux…

    2025年3月8日
    200
  • React下setState机制的简单介绍

    本篇文章给大家带来的内容是关于react下setstate机制的简单介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 api解析: setState(updater, [callback]) updater: 更新数据 …

    2025年3月8日
    200

发表回复

登录后才能评论