Если я могу вызывать родительские методы через это, то зачем использовать супер в ES6? - PullRequest
0 голосов
/ 01 октября 2018

Допустим, у нас есть класс ABC :

class ABC{
    constructor(param1, param2){
        this.prop1 = param1;
        this.prop2 = param2;
    }
    ABCMethod1(){
        console.log(this.prop1 + ' ' + this.prop2);
    }
}

И еще один класс XYZ , который расширяет класс ABC :

class XYZ extends ABC{
    XYZMethod1(){
        this.ABCMethod1();
    }
}

Итак, ES6 ввел новое ключевое слово super , которое используется для доступа к членам родительского класса в дочернем классе.Но я могу легко получить доступ к членам родительского класса в дочернем классе, используя this :

var myObject = new XYZ('Property 1','Property 2');
myObject.XYZMethod1();

, который печатает следующее в консоли браузера:

Property 1 Property 2

Теперь давайте сделаем то же самое, используя super вместо this в дочернем классе XYZ :

class XYZ extends ABC{
    XYZMethod1(){
        super.ABCMethod1();
    }
}

Теперь давайтевызовите XYZmethod1 () еще раз, чтобы увидеть, каков будет результат:

var myObject = new XYZ('Property 1','Property 2');
myObject.XYZMethod1();

, который выводит на консоль браузера следующее:

Property 1 Property 2

Результат: Оба this и super возвращают одинаковый вывод Property 1 Property 2 в консоли.Итак, если мы можем получить доступ к родительским методам, используя this , тогда какова цель super в ES6, зачем нам его использовать?Кто-нибудь может сказать простыми словами на примере?

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Если у вас есть один и тот же метод , определенный в родительском и дочернем классах, super явно позволяет вам получить реализацию родителя.Да, Javascript (и практически все другие языки ООП) будут проходить цепочку прототипов вверх, чтобы найти свойства, определенные для родителей, поэтому вам не нужно вызывать метод родителя.На самом деле, вы не обязательно знаете, сколько слоев определено для метода, поэтому было бы безумием нуждаться в нем.Он нужен только для устранения неоднозначности, когда существует более одной возможной реализации (текущий класс или его родитель).

В основном это используется при переопределении реализации родителя, но все еще требуется вызвать реализацию родителя:

class Foo {
    constructor() {}
    bar() {}
}

class Baz {
    constructor() {
        super();
        console.log(42);
    }

    bar() {
        super.bar();
        console.log(42);
    }
}
0 голосов
/ 01 октября 2018

Упрощает вызов конструктора суперкласса:

 constructor() {
   super("param 1", "param 2");
 }

И позволяет легко вызывать метод суперкласса, если он переопределяется подклассом (с тем же именем):

 class Animal {
  move() {
   console.log("moves");
  }
}

class Bird extends Animal {
 move() {
  super.move();
  // this.move() would end into endless recursion
  console.log("flies");
 }
}
...