ES6 super关键字

男娘i 2022-06-06 20:29 282阅读 0赞

我们知道,this关键字总是指向函数运行时所在的当前对象,ES6 又新增了另一个类似的关键字super,指向当前对象的原型对象。

  1. let prop = {
  2. name: "zhang"
  3. };
  4. const a = {
  5. find(){ //对象的方法
  6. return super.name;
  7. }
  8. };
  9. Object.setPrototypeOf(a, prop);
  10. console.log(
  11. a.find() //zhang
  12. );

上面代码中,对象obj的find方法之中,通过super.foo引用了原型对象proto的foo属性。

注意,super关键字表示原型对象时,只能用在对象的方法之中,用在其他地方都会报错。

对象的方法,是什么意思呢?
- 目前,只有对象的 方法的简写法 可以让 JavaScript 引擎确认,定义的是对象的方法

  1. // 报错
  2. const obj = {
  3. foo: super.foo
  4. }
  5. // 报错
  6. const obj = {
  7. foo: () => super.foo
  8. }
  9. // 报错
  10. const obj = {
  11. foo: function () {
  12. return super.foo
  13. }
  14. }

上面三种super的用法都会报错,因为对于 JavaScript 引擎来说,这里的 super 都没有用在对象的方法之中。第一种写法是super用在属性里面,第二种和第三种写法是 super 用在一个函数里面,然后赋值给foo属性。

JavaScript 引擎内部,super.foo等同于Object.getPrototypeOf(this).foo(属性的方式)或Object.getPrototypeOf(this).foo.call(this)(方法的方式)。

  1. const proto = {
  2. x: 'hello',
  3. foo() {
  4. console.log(this.x);
  5. },
  6. };
  7. const obj = {
  8. x: 'world',
  9. foo() {
  10. super.foo();
  11. }
  12. }
  13. Object.setPrototypeOf(obj, proto);
  14. obj.foo() // "world"

上面代码中,super.foo指向原型对象proto的foo方法,但是绑定的this却还是当前对象obj,因此输出的就是world。

下面是 extend 实现继承的例子,使用 super 访问父类:

  1. class parentA {
  2. constructor() {
  3. this.id = "p_a" //这里的 this 动态指定的
  4. }
  5. foo() {
  6. console.log("Parent_a:" + this.id);
  7. }
  8. }
  9. parentA.prototype.id = "p_p_id";
  10. class childA extends parentA{
  11. constructor() {
  12. super();
  13. this.id = "c_a";
  14. }
  15. foo() {
  16. super.foo(); //super不能动态绑定,super在class声明的时候就定了
  17. console.log("Child_a:" + this.id + ":" + super.id);
  18. }
  19. }
  20. let c = new childA();
  21. c.foo();
  22. //Parent_a:c_a
  23. //Child_a:c_a:p_p_id

发表评论

表情:
评论列表 (有 0 条评论,282人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ES6 super

    super存在于类的函数中,constructor、普通方法、静态方法,分别代表不同值。 super大三用处 (1)在constructor中 super()执行,相等于

    相关 super关键字

    super关键字的使用 1.super理解为:父类的 2.super可以用来调用:属性、方法、构造器 3.super的使用:调用属性和方法 3.1 我们可以在子类的

    相关 ES6 super关键字

    我们知道,this关键字总是指向函数运行时所在的当前对象,ES6 又新增了另一个类似的关键字super,指向当前对象的原型对象。 let prop = {

    相关 ES6中的super关键字

    在其它面向对象的语言中都能看到一个关键字`super`。这个关键字的含义通常是“父类”的意思。而在Javascript中,`super`换了一个与“父类”相近的含义,即“原型(