Каталог
Веб-разработка с нуля: четыре курса по порядку.
HTML, затем CSS, JavaScript и SQL. Каждый курс говорит, что нужно знать до него и что вы будете уметь после.
Загружаем курсы…
Каталог
HTML, затем CSS, JavaScript и SQL. Каждый курс говорит, что нужно знать до него и что вы будете уметь после.
Загружаем курсы…
Урок 94 из 114 · 7 мин
Symbol.hasInstance, Symbol.isConcatSpreadable, Symbol.species и Symbol.unscopables: как настроить поведение встроенных операций.
Я сам вызываю особые методы-символы, когда ты пишешь instanceof или concat. Переопредели их — и я буду слушаться тебя.
Symbol.hasInstance[Symbol.hasInstance](x) решает, что вернёт x instanceof Класс.class HasPrice {
static [Symbol.hasInstance](x) { return typeof x?.price === "number"; }
}
console.log({ price: 220 } instanceof HasPrice, {} instanceof HasPrice);Symbol.isConcatSpreadabletrue, объект-«массив» раскрывается в concat; если false у массива — вставляется целиком.const pair = { length: 2, 0: "Блокнот", 1: "Пенал", [Symbol.isConcatSpreadable]: true };
const box = ["Ластик"];
box[Symbol.isConcatSpreadable] = false;
console.log(["Чай"].concat(pair), ["Чай"].concat(box).length);Symbol.speciesmap, filter, then) создают результат через constructor[Symbol.species]. Переопредели — и наследник вернёт обычный Array.class Menu extends Array {
static get [Symbol.species]() { return Array; }
}
const m = Menu.from([1, 2]);
console.log(m instanceof Menu, m.map((x) => x) instanceof Menu);Symbol.unscopableswith.console.log(Object.keys(Array.prototype[Symbol.unscopables]).slice(0, 4));Встроенные символы — это крючки, за которые цепляется сам язык. Трогай их, когда делаешь свою «встроенную» коллекцию.
Сделай класс Drink со статическим [Symbol.hasInstance](x): true для объектов, у которых есть строка name и число price.
Выберите один ответ.
Зачем Symbol.species?
Проверяем состояние обучения…