Baseline Widely available *
ÐлаÑÑÑ Ð² JavaScript бÑли Ð²Ð²ÐµÐ´ÐµÐ½Ñ Ð² ECMAScript 2015 и пÑедÑÑавлÑÑÑ Ñобой ÑинÑакÑиÑеÑкий ÑÐ°Ñ Ð°Ñ Ð½Ð°Ð´ ÑÑÑеÑÑвÑÑÑим в JavaScript Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð¼ пÑоÑоÑипного наÑледованиÑ. СинÑакÑÐ¸Ñ ÐºÐ»Ð°ÑÑов не Ð²Ð²Ð¾Ð´Ð¸Ñ Ð½Ð¾Ð²ÑÑ Ð¾Ð±ÑекÑно-оÑиенÑиÑованнÑÑ Ð¼Ð¾Ð´ÐµÐ»Ñ, а пÑедоÑÑавлÑÐµÑ Ð±Ð¾Ð»ÐµÐµ пÑоÑÑой и понÑÑнÑй ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов и оÑганизаÑии наÑледованиÑ.
ÐпÑеделение клаÑÑовÐа Ñамом деле клаÑÑÑ â ÑÑо "ÑпеÑиалÑнÑе ÑÑнкÑии", поÑÑÐ¾Ð¼Ñ ÑоÑно Ñакже, как Ð²Ñ Ð¾Ð¿ÑеделÑеÑе ÑÑнкÑии (function expressions и function declarations), Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе опÑеделÑÑÑ Ð¸ клаÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ: class declarations и class expressions.
ÐбÑÑвление клаÑÑаÐеÑвÑй ÑпоÑоб опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑа â class declaration (обÑÑвление клаÑÑа). ÐÐ»Ñ ÑÑого необÑ
одимо воÑполÑзоваÑÑÑÑ ÐºÐ»ÑÑевÑм Ñловом class
и ÑказаÑÑ Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа (в пÑимеÑе â «Rectangle»).
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
ÐодÑÑм (hoisting)
РазниÑа Ð¼ÐµÐ¶Ð´Ñ Ð¾Ð±ÑÑвлением ÑÑнкÑии (function declaration) и обÑÑвлением клаÑÑа (class declaration) в Ñом, ÑÑо обÑÑвление ÑÑнкÑии ÑовеÑÑÐ°ÐµÑ Ð¿Ð¾Ð´ÑÑм (hoisting), в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº обÑÑвление клаÑÑа â неÑ. ÐоÑÑÐ¾Ð¼Ñ Ð²Ð½Ð°Ñале необÑ
одимо обÑÑвиÑÑ Ð²Ð°Ñ ÐºÐ»Ð°ÑÑ Ð¸ ÑолÑко заÑем ÑабоÑаÑÑ Ñ Ð½Ð¸Ð¼, а код же вÑоде ÑледÑÑÑего ÑгенеÑиÑÑÐµÑ Ð¸ÑклÑÑение Ñипа ReferenceError
:
var p = new Rectangle(); // ReferenceError
class Rectangle {}
ÐÑÑажение клаÑÑа
ÐÑоÑой ÑпоÑоб опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑа â class expression (вÑÑажение клаÑÑа). Ðожно ÑоздаваÑÑ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ñе и безÑмÑннÑе вÑÑажениÑ. РпеÑвом ÑлÑÑае Ð¸Ð¼Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑа Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² локалÑной облаÑÑи видимоÑÑи клаÑÑа и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÑÑено ÑеÑез ÑвойÑÑва Ñамого клаÑÑа, а не его ÑкземплÑÑа.
// безÑмÑннÑй
var Rectangle = class {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
console.log(Rectangle.name);
// оÑобÑазиÑÑÑ: "Rectangle"
// именованнÑй
var Rectangle = class Rectangle2 {
constructor(height, width) {
this.height = height;
this.width = width;
}
};
console.log(Rectangle.name);
// оÑобÑазиÑÑÑ: "Rectangle2"
ÐÑимеÑание: ÐÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑа подвеÑÐ¶ÐµÐ½Ñ Ñем же пÑоблемам Ñ Ð¿Ð¾Ð´ÑÑмом (hoisting), ÑÑо и обÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÐºÐ»Ð°ÑÑа.
Тело клаÑÑа и задание меÑодовТело клаÑÑа â ÑÑо ÑаÑÑÑ ÐºÐ¾Ð´Ð°, заклÑÑÑÐ½Ð½Ð°Ñ Ð² ÑигÑÑнÑе Ñкобки {}
. ÐдеÑÑ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе обÑÑвлÑÑÑ ÑÐ»ÐµÐ½Ñ ÐºÐ»Ð°ÑÑа, Ñакие как меÑÐ¾Ð´Ñ Ð¸ конÑÑÑÑкÑоÑ.
Тела обÑÑвлений клаÑÑов и вÑÑажений клаÑÑов вÑполнÑÑÑÑÑ Ð² ÑÑÑогом Ñежиме (strict mode).
ConstructorÐеÑод constructor
â ÑпеÑиалÑнÑй меÑод, необÑ
одимÑй Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ иниÑиализаÑии обÑекÑов, ÑозданнÑÑ
, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ»Ð°ÑÑа. РклаÑÑе Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко один меÑод Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ constructor
. ÐÑклÑÑение Ñипа SyntaxError
бÑÐ´ÐµÑ Ð²ÑбÑоÑено, еÑли клаÑÑ ÑодеÑÐ¶Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ одного вÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¼ÐµÑода constructor
.
ÐлÑÑевое Ñлово super
можно иÑполÑзоваÑÑ Ð² меÑоде constructor
Ð´Ð»Ñ Ð²Ñзова конÑÑÑÑкÑоÑа ÑодиÑелÑÑкого клаÑÑа.
СмоÑÑиÑе Ñакже опÑеделение меÑодов.
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
get area() {
return this.calcArea();
}
calcArea() {
return this.height * this.width;
}
}
const square = new Rectangle(10, 10);
console.log(square.area); // 100
СÑаÑиÑеÑкие меÑÐ¾Ð´Ñ Ð¸ ÑвойÑÑва
ÐлÑÑевое Ñлово static
, опÑеделÑÐµÑ ÑÑаÑиÑеÑкий меÑод или ÑвойÑÑва Ð´Ð»Ñ ÐºÐ»Ð°ÑÑа. СÑаÑиÑеÑкие меÑÐ¾Ð´Ñ Ð¸ ÑвойÑÑва вÑзÑваÑÑÑÑ Ð±ÐµÐ· инÑÑанÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ñ
клаÑÑа, и не могÑÑ Ð±ÑÑÑ Ð²ÑÐ·Ð²Ð°Ð½Ñ Ñ ÑкземплÑÑов (instance) клаÑÑа. СÑаÑиÑеÑкие меÑодÑ, ÑаÑÑо иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑлÑжебнÑÑ
ÑÑнкÑий Ð´Ð»Ñ Ð¿ÑиложениÑ, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº ÑÑаÑиÑеÑкие ÑвойÑÑва Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð´Ð»Ñ ÐºÐµÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² ÑамкаÑ
клаÑÑа, ÑикÑиÑованной конÑигÑÑаÑии или лÑбÑÑ
дÑÑгиÑ
Ñелей, не ÑвÑзаннÑÑ
Ñ ÑеплеÑиÑованием даннÑÑ
Ð¼ÐµÐ¶Ð´Ñ ÑкземплÑÑами.
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
static displayName = "ТоÑка";
static distance(a, b) {
const dx = a.x - b.x;
const dy = a.y - b.y;
return Math.hypot(dx, dy);
}
}
const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
p1.displayName; //undefined
p1.distance; //undefined
p2.displayName; //undefined
p2.distance; //undefined
console.log(Point.displayName); // "ТоÑка"
console.log(Point.distance(p1, p2)); // 7.0710678118654755
ÐÑивÑзка this
в пÑоÑоÑипнÑÑ
и ÑÑаÑиÑеÑкиÑ
меÑодаÑ
Ðогда ÑÑаÑиÑеÑкий или пÑоÑоÑипнÑй меÑод вÑзÑваеÑÑÑ Ð±ÐµÐ· пÑивÑзки к this обÑекÑа (или когда this ÑвлÑеÑÑÑ Ñипом boolean, string, number, undefined, null), Ñогда this бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°Ñение undefined внÑÑÑи вÑзÑваемой ÑÑнкÑии. Ðоведение бÑÐ´ÐµÑ Ñаким же даже без диÑекÑÐ¸Ð²Ñ "use strict"
, поÑÐ¾Ð¼Ñ ÑÑо код внÑÑÑи Ñела клаÑÑа вÑегда вÑполнÑеÑÑÑ Ð² ÑÑÑогом Ñежиме.
class Animal {
speak() {
return this;
}
static eat() {
return this;
}
}
let obj = new Animal();
obj.speak(); // обÑÐµÐºÑ Animal
let speak = obj.speak;
speak(); // undefined
Animal.eat(); // клаÑÑ Animal
let eat = Animal.eat;
eat(); // undefined
ÐÑли Ð¼Ñ Ð½Ð°Ð¿Ð¸Ñем ÑÑÐ¾Ñ Ð¶Ðµ код иÑполÑзÑÑ ÐºÐ»Ð°ÑÑÑ Ð¾ÑнованнÑе на ÑÑнкÑиÑÑ , Ñогда пÑоизойдÑÑ Ð°Ð²ÑоÑпаковка оÑÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð½Ð° знаÑении this, в ÑеÑение коÑоÑого ÑÑнкÑÐ¸Ñ Ð±Ñла вÑзвана. Ð ÑÑÑогом Ñежиме авÑоÑпаковка не пÑоизойдÑÑ - знаÑение this оÑÑанеÑÑÑ Ð¿Ñежним.
function Animal() {}
Animal.prototype.speak = function () {
return this;
};
Animal.eat = function () {
return this;
};
let obj = new Animal();
let speak = obj.speak;
speak(); // глобалÑнÑй обÑÐµÐºÑ (неÑÑÑогий Ñежим)
let eat = Animal.eat;
eat(); // глобалÑнÑй обÑÐµÐºÑ (неÑÑÑогий Ñежим)
СвойÑÑва ÑкземплÑÑа
СвойÑÑва ÑкземплÑÑа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² меÑоде клаÑÑа:
class Rectangle { constructor(height, width) { this.height = height; this.width = width; } }
СÑаÑиÑеÑкие (class-side) ÑвойÑÑва и ÑвойÑÑва пÑоÑоÑипа Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð·Ð° Ñамками Ñела клаÑÑа:
Rectangle.staticWidth = 20; Rectangle.prototype.prototypeWidth = 25;ÐпÑеделение полей
ÐÑедÑпÑеждение: ÐÑблиÑнÑе и пÑиваÑнÑе Ð¿Ð¾Ð»Ñ - ÑÑо ÑкÑпеÑименÑалÑÐ½Ð°Ñ Ð¾ÑобенноÑÑÑ (stage 3), пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð¸ÑеÑом TC39 по ÑÑандаÑÑам ÑзÑка Javascript. ÐоддеÑжка бÑаÑзеÑами огÑаниÑена, но ÑÑо нововведение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзовано на моменÑе ÑбоÑки, иÑполÑзÑÑ Ðº пÑимеÑÑ Babel.
ÐÑблиÑнÑе полÑÐÑполÑзÑÑ Javascript ÑинÑакÑÐ¸Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹, пÑиведÑннÑй вÑÑе пÑÐ¸Ð¼ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ñн ÑледÑÑÑим обÑазом:
class Rectangle { height = 0; width; constructor(height, width) { this.height = height; this.width = width; } }
Ðак видно из пÑимеÑа, Ð¿Ð¾Ð»Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ñ ÐºÐ°Ðº Ñо наÑалÑнÑм знаÑением, Ñак и без него.
Ðолее подÑобно об ÑÑом напиÑано в пÑблиÑнÑе Ð¿Ð¾Ð»Ñ ÐºÐ»Ð°ÑÑа.
ÐÑиваÑнÑе полÑÐÑедÑдÑÑий пÑÐ¸Ð¼ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ñн ÑледÑÑÑим обÑазом, иÑполÑзÑÑ Ð¿ÑиваÑнÑе полÑ:
class Rectangle { #height = 0; #width; constructor(height, width) { this.#height = height; this.#width = width; } }
ÐÑиваÑнÑе Ð¿Ð¾Ð»Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð¸Ð»Ð¸ пÑоÑиÑÐ°Ð½Ñ ÑолÑко в ÑÐ°Ð¼ÐºÐ°Ñ ÐºÐ»Ð°ÑÑа и не могÑÑ Ð±ÑÑÑ Ð²ÑÐ·Ð²Ð°Ð½Ñ Ð¸Ð·Ð²Ð½Ðµ. ÐпÑеделÑÑ Ð²ÐµÑи, коÑоÑÑе не Ð²Ð¸Ð´Ð½Ñ Ð·Ð° пÑеделами клаÑÑа, Ð²Ñ Ð³Ð°ÑанÑиÑÑеÑе, ÑÑо полÑзоваÑели ваÑÐ¸Ñ ÐºÐ»Ð°ÑÑов не могÑÑ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ Ð²Ð½ÑÑÑÐµÐ½Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñов, коÑоÑÑе могÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð²ÐµÑÑÐ¸Ñ Ð½Ð° веÑÑиÑ.
ÐÑимеÑание: ÐÑиваÑнÑе Ð¿Ð¾Ð»Ñ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ñ ÑолÑко заÑанее в обÑÑвлении полÑ.
ÐÑиваÑнÑе Ð¿Ð¾Ð»Ñ Ð½Ðµ могÑÑ Ð±ÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ñ Ð¿Ð¾Ð·Ð¶Ðµ пÑÑÑм пÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ знаÑениÑ, в оÑлиÑии Ð¾Ñ Ð¾Ð±ÑÑнÑÑ ÑвойÑÑв.
Ðолее подÑобно об ÑÑом напиÑано в ÐÑиваÑнÑе Ð¿Ð¾Ð»Ñ ÐºÐ»Ð°ÑÑа.
ÐаÑледование клаÑÑов Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑextends
ÐлÑÑевое Ñлово extends
иÑполÑзÑеÑÑÑ Ð² обÑÑвлениÑÑ
клаÑÑов и вÑÑажениÑÑ
клаÑÑов Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ»Ð°ÑÑа, доÑеÑнего оÑноÑиÑелÑно дÑÑгого клаÑÑа.
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} издаÑÑ Ð·Ð²Ñк.`);
}
}
class Dog extends Animal {
constructor(name) {
super(name); // вÑзÑÐ²Ð°ÐµÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ super клаÑÑа и пеÑедаÑÑ Ð¿Ð°ÑамеÑÑ name
}
speak() {
console.log(`${this.name} лаеÑ.`);
}
}
let d = new Dog("ÐиÑÑи");
d.speak(); // ÐиÑÑи лаеÑ
ÐÑли в подклаÑÑе пÑиÑÑÑÑÑвÑÐµÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑ, он должен ÑнаÑала вÑзваÑÑ super, пÑежде Ñем иÑполÑзоваÑÑ this.
ÐналогиÑнÑм обÑазом можно ÑаÑÑиÑÑÑÑ ÑÑадиÑионнÑе, оÑнованнÑе на ÑÑнкÑиÑÑ "клаÑÑÑ":
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function () {
console.log(`${this.name} издаÑÑ Ð·Ð²Ñк.`);
};
class Dog extends Animal {
speak() {
console.log(`${this.name} лаеÑ.`);
}
}
let d = new Dog("ÐиÑÑи");
d.speak(); // ÐиÑÑи лаеÑ
// ÐÐ»Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ÑнÑÑ
меÑодов доÑеÑний меÑод Ð¸Ð¼ÐµÐµÑ Ð¿ÑиоÑиÑÐµÑ Ð½Ð°Ð´ ÑодиÑелÑÑким.
ÐбÑаÑиÑе внимание, ÑÑо клаÑÑÑ Ð½Ðµ могÑÑ ÑаÑÑиÑÑÑÑ Ð¾Ð±ÑÑнÑе (non-constructible) обÑекÑÑ. ÐÑли вам необÑ
одимо ÑоздаÑÑ Ð½Ð°Ñледование Ð¾Ñ Ð¾Ð±ÑÑного обÑекÑа, в каÑеÑÑве Ð·Ð°Ð¼ÐµÐ½Ñ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ Object.setPrototypeOf()
:
var Animal = {
speak() {
console.log(`${this.name} издаÑÑ Ð·Ð²Ñк.`);
},
};
class Dog {
constructor(name) {
this.name = name;
}
}
// ÐÑли Ð²Ñ ÑÑого не ÑделаеÑе, Ð²Ñ Ð¿Ð¾Ð»ÑÑиÑе оÑÐ¸Ð±ÐºÑ TypeError пÑи вÑзове speak.
Object.setPrototypeOf(Dog.prototype, Animal);
let d = new Dog("ÐиÑÑи");
d.speak(); // ÐиÑÑи издаÑÑ Ð·Ð²Ñк.
Species
ÐопÑÑÑим, вам Ñ
оÑелоÑÑ Ð±Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð¾Ð±ÑекÑÑ Ñипа Array
в ваÑем пÑоизводном Ð¾Ñ Ð¼Ð°ÑÑива клаÑÑе MyArray
. ÐаÑÑеÑн species позволÑÐµÑ Ð²Ð°Ð¼ пеÑеопÑеделÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑÑ Ð¿Ð¾ ÑмолÑаниÑ.
ÐапÑимеÑ, пÑи иÑполÑзовании ÑакиÑ
меÑодов, как map()
, коÑоÑÑй возвÑаÑÐ°ÐµÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ Ð¿Ð¾ ÑмолÑаниÑ, вам Ñ
оÑелоÑÑ Ð±Ñ, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ возвÑаÑали ÑодиÑелÑÑкий обÑÐµÐºÑ Array
вмеÑÑо обÑекÑа MyArray
. Символ Symbol.species
позволÑÐµÑ ÑÑо ÑеализоваÑÑ:
class MyArray extends Array {
// ÐзмениÑÑ species на ÑодиÑелÑÑкий конÑÑÑÑкÑÐ¾Ñ Array
static get [Symbol.species]() {
return Array;
}
}
var a = new MyArray(1, 2, 3);
var mapped = a.map((x) => x * x);
console.log(mapped instanceof MyArray); // false
console.log(mapped instanceof Array); // true
ÐбÑаÑение к ÑодиÑелÑÑÐºÐ¾Ð¼Ñ ÐºÐ»Ð°ÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ super
ÐлÑÑевое Ñлово super
иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð²Ñзова ÑÑнкÑий на ÑодиÑеле обÑекÑа.
class Cat {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} издаÑÑ Ð·Ð²Ñк.`);
}
}
class Lion extends Cat {
speak() {
super.speak();
console.log(`${this.name} ÑÑÑиÑ.`);
}
}
let l = new Lion("Фаззи");
l.speak();
// Фаззи издаÑÑ Ð·Ð²Ñк.
// Фаззи ÑÑÑиÑ.
Mix-ins
ÐбÑÑÑакÑнÑе подклаÑÑÑ, или mix-ins, â ÑÑо ÑÐ°Ð±Ð»Ð¾Ð½Ñ Ð´Ð»Ñ ÐºÐ»Ð°ÑÑов. У клаÑÑа в ECMAScript Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑолÑко один ÑодиÑелÑÑкий клаÑÑ, поÑÑÐ¾Ð¼Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвенное наÑледование (к пÑимеÑÑ, Ð¾Ñ tooling classes) невозможно. ФÑнкÑионалÑноÑÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ пÑедоÑÑавлÑÑÑ ÑодиÑелÑÑкий клаÑÑ.
ÐÐ»Ñ ÑеализаÑии mix-ins в ECMAScript можно иÑполÑзоваÑÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð² каÑеÑÑве аÑгÑменÑа пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑодиÑелÑÑкий клаÑÑ, а возвÑаÑÐ°ÐµÑ Ð¿Ð¾Ð´ÐºÐ»Ð°ÑÑ, его ÑаÑÑиÑÑÑÑий:
var calculatorMixin = (Base) =>
class extends Base {
calc() {}
};
var randomizerMixin = (Base) =>
class extends Base {
randomize() {}
};
ÐлаÑÑ, иÑполÑзÑÑÑий Ñакие mix-ins, можно опиÑаÑÑ ÑледÑÑÑим обÑазом:
class Foo {}
class Bar extends calculatorMixin(randomizerMixin(Foo)) {}
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами ÐовÑоÑное опÑеделение клаÑа
ÐлаÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑеопÑеделÑн. ÐопÑÑка ÑÑого пÑиведÑÑ Ðº SyntaxError
.
ÐÑли Ð¼Ñ Ð·Ð°Ð¿ÑÑкаеÑе код в веб бÑаÑзеÑе, к пÑимеÑÑ Ð² Firefox Web Console (Tools > Web Developer > Web Console) и Ð²Ñ Ð¸ÑполÑзÑеÑе ('Run') опÑеделение клаÑÑа Ñ Ð¾Ð´Ð½Ð¸Ð¼ и Ñем же именем дваждÑ, Ð²Ñ Ð¿Ð¾Ð»ÑÑиÑе SyntaxError: redeclaration of let ClassName;
. (ÐбÑÑждение по оÑибке можно поÑмоÑÑеÑÑ Ð² Firefox bug 1428672.) Chrome Developer Tools возвÑаÑÐ°ÐµÑ ÑообÑение Ñипа Uncaught SyntaxError: Identifier 'ClassName' has already been declared at <anonymous>:1:1
.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4