Во-первых, ES6class
Он относится к своего рода «синтаксическому сахару», поэтому он просто более элегантен и больше похож на объектно-ориентированное программирование, а его идеи согласуются с ES5.
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype.toString = function() {
return '(' + this.x + ',' + this.y + ')';
}
Эквивалентно
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ',' + this.y + ')';
}
}
вconstructor
Метод является конструктором класса и является методом по умолчаниюnew
Этот метод вызывается автоматически, когда команда создает экземпляр объекта. Класс должен иметьconstructor
метод, если он не определен явно, по умолчаниюconsructor
Метод будет добавлен по умолчанию. Поэтому, даже если вы не добавите конструктор, будет конструктор по умолчанию. в общемconstructor
метод возвращает экземпляр объектаthis
, но вы также можете указатьconstructor
Метод возвращает совершенно новый объект, так что возвращаемый экземпляр объекта не является экземпляром класса.
Давайте хорошо проанализируемsuper
Роль ключевых слов:
super
Это ключевое слово может использоваться либо как функция, либо как объект. В обоих случаях его использование совершенно бесполезно.
1. как функция использует
class A {}
class B extends A {
constructor() {
super(); // ES6 要求,子类的构造函数必须执行一次 super 函数,否则会报错。
}
}
Примечание: вconstructor
должен быть вызванsuper
метод, так как подклассы не имеют своих собственныхthis
объект, но наследует родительский классthis
объект, а затем обработать его, в то время какsuper
Он представляет конструктор родительского класса.super
Хотя он представляет конструктор родительского класса A, он возвращает экземпляр подкласса B, то естьsuper
Внутреннийthis
относится к B, поэтомуsuper()
Это эквивалентно ````A.prototype.constructor.call(this, props)``.
class A {
constructor() {
console.log(new.target.name); // new.target 指向当前正在执行的函数
}
}
class B extends A {
constructor {
super();
}
}
new A(); // A
new B(); // B
Видно, что вsuper()
При выполнении он указывает на конструктор подкласса B, а не на конструктор родительского класса A. То есть,super()
Внутреннийthis
указывает на Б.
2. Использовать как объект
В обычных методах он указывает на объект-прототип родительского класса, в статических — на родительский класс.
class A {
c() {
return 2;
}
}
class B extends A {
constructor() {
super();
console.log(super.c()); // 2
}
}
let b = new B();
В приведенном выше коде в подклассе Bsuper.c()
, этоsuper
используется как предмет. В настоящее время,super
Обычными методами, указывая наA.prototype
,такsuper.c()
эквивалентноA.prototype.c()
.
пройти черезsuper
При вызове метода родительского классаsuper
будет связывать подклассthis
.
class A {
constructor {
this.x = 1;
}
s() {
console.log(this.x);
}
}
class B extends A {
constructor {
super();
this.x = 2;
}
m() {
super.s();
}
}
let b = new B();
b.m(); // 2
В приведенном выше кодеsuper.s()
Хотя звонокA.prototytpe.s()
,ноA.prototytpe.s()
будет связывать подкласс Bthis
, В результате на выходе будет 2 вместо 1. Что, собственно, и выполняетсяsuper.s.call(this)
.
Поскольку подкласс привязки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
}
}
let b = new B();
В приведенном выше кодеsuper.x
Присвоение равно 3, что эквивалентноthis.x
Присвоить значение 3. и при чтенииsuper.x
, звонокA.prototype.x
, но нетx
метод, поэтому возвращает undefined.
Обратите внимание, что использованиеsuper
При его использовании необходимо явно указать, используется ли он как функция или как объект, иначе будет сообщено об ошибке.
class A {}
class B extends A {
constructor() {
super();
console.log(super); // 报错
}
}
В приведенном выше кодеconsole.log(super);
принадлежащийsuper
, невозможно увидеть, используется ли он как функция или как объект, поэтому движок JavaScript сообщит об ошибке при разборе кода. Это если можно наглядно показатьsuper
тип данных, об ошибке не будет сообщено.
Наконец, поскольку объекты всегда наследуются от других объектов, в любом объекте используйтеsuper
ключевые слова.
Заключение:
В конце концов, класс ES6 — это «синтаксический сахар», поэтому, пока вы понимаете концепцию объектов и объектно-ориентированных идей в JavaScript, понять классы несложно.