Знакомство с ES6. Урок 21

Содержание

Слайд 2

ES6

let&const
Деструктуризация (массивов и объектов)
…Spread-оператор
Стрелочные функции
Шаблонные строки

ES6 let&const Деструктуризация (массивов и объектов) …Spread-оператор Стрелочные функции Шаблонные строки

Слайд 3

Метод includes

Проверяет, включает ли одна строка str в себя другую строку searchString,

Метод includes Проверяет, включает ли одна строка str в себя другую строку
возвращает true/false

let str = 'To be, or not to be, that is the question.';
console.log(str.includes('To be'));       //true
console.log(str.includes('question'));    //true
console.log(str.includes('nonexistent')); //false
console.log(str.includes('To be', 1));    //false
console.log(str.includes('TO BE'));       //false 

Слайд 4

Метод endsWith

Возвращает true, если строка str заканчивается подстрокой searchString

let str =

Метод endsWith Возвращает true, если строка str заканчивается подстрокой searchString let str
'To be, or not to be, that is the question.';
console.log(str.endsWith('question.'));//true
console.log(str.endsWith('to be'));    //false
console.log(str.endsWith('to be', 19));//true

Слайд 5

Метод startsWith

Возвращает true, если строка str начинается со строки searchString

let str

Метод startsWith Возвращает true, если строка str начинается со строки searchString let
= 'To be, or not to be, that is the question.';
console.log(str.startsWith('To be'));        //true
console.log(str.startsWith('not to be'));    //false
console.log(str.startsWith('not to be', 10));//true

Слайд 6

Метод repeat

Повторяет строку str count раз

'abc'.repeat(-1); //RangeError
'abc'.repeat(0); //''
'abc'.repeat(1); //'abc'
'abc'.repeat(2); //'abcabc'
'abc'.repeat(3.5); //'abcabcabc'

Метод repeat Повторяет строку str count раз 'abc'.repeat(-1); //RangeError 'abc'.repeat(0); //'' 'abc'.repeat(1);
(count will be converted to integer)
'abc'.repeat(1/0); //RangeError

Слайд 7

Объекты и прототипы

Объекты и прототипы

Слайд 8

Короткое свойство

При объявлении свойства объекта достаточно указать только его имя, а значение

Короткое свойство При объявлении свойства объекта достаточно указать только его имя, а
будет взято из переменной с аналогичным именем

let name = "Вася";
let isAdmin = true;
let user = {
name,
isAdmin
};
console.log(JSON.stringify(user));//{"name": "Вася", "isAdmin": true}

Слайд 9

Вычисляемые свойства

let propName = "firstName";
let user = {
[propName]: "Вася"
};
console.log(user.firstName);//Вася

Вычисляемые свойства let propName = "firstName"; let user = { [propName]: "Вася" }; console.log(user.firstName);//Вася

Слайд 10

Вычисляемые свойства

let a = "Зелёный ";
let b = "Крокодил";
let user = {

Вычисляемые свойства let a = "Зелёный "; let b = "Крокодил"; let
[(a + b).toLowerCase()]: "Петя"
};
console.log( user["зелёный крокодил"] );//Петя

Слайд 11

Метод setPrototypeOf

Метод устанавливает прототип (внутреннее свойство [[Prototype]]) указанного объекта в другой объект

Метод setPrototypeOf Метод устанавливает прототип (внутреннее свойство [[Prototype]]) указанного объекта в другой
или null

let dict = Object.setPrototypeOf({}, null);                
let person = {
    name: 'unknown'
};
let student = {
    group: 1
};
let p1 = Object.setPrototypeOf(student, person);
console.log(p1.group);//1
console.log(p1.name);//unknown 

Слайд 12

Object.assign

Метод используется для копирования значений всех собственных перечисляемых свойств из одного или

Object.assign Метод используется для копирования значений всех собственных перечисляемых свойств из одного
более объектов в целевой объект

Object.assign(target, src1, src2...)                                   
let o1 = { a: 1 };
let o2 = { b: 2 };
let o3 = { c: 3 };
let obj = Object.assign(o1, o2, o3);
console.log(obj);//{ a: 1, b: 2, c: 3 }
console.log(o1); //{ a: 1, b: 2, c: 3 }
//изменился и целевой объект 

Слайд 13

Object.is

Метод определяет, являются ли два значения одинаковыми

Iet sSame = Object.is(value1, value2);                                           
Object.is('foo',

Object.is Метод определяет, являются ли два значения одинаковыми Iet sSame = Object.is(value1,
'foo');   //true
Object.is(window, window); //true
Object.is('foo', 'bar');   //false
Object.is([], []);         //false
let test = { a: 1 };
Object.is(test, test);     //true
Object.is(null, null);     //true
//Специальные случаи
Object.is(0, -0);          //false
Object.is(-0, -0);         //true
Object.is(NaN, 0/0);       //true
Object.is(NaN, NaN);       //true

Слайд 14

Объявление метода

Более короткий и удобный синтаксис

let name = "Вася";
let user = {

Объявление метода Более короткий и удобный синтаксис let name = "Вася"; let
name,
//something: function()
//{
//console.log(this.name);
//}
something() {
console.log(this.name);
}
};
user.something();//Вася

Слайд 15

Классы

Классы

Слайд 16

Объявление класса

class Название [extends Родитель] {
constructor
методы
}

Объявление класса class Название [extends Родитель] { constructor методы }

Слайд 17

Объявление класса

class Polygon {
constructor(height, width) {
this.height = height;
this.width =

Объявление класса class Polygon { constructor(height, width) { this.height = height; this.width = width; } }
width;
}
}

Слайд 18

Выражение класса

//безымянный
var Polygon = class {
constructor(height, width) {
this.height = height;

Выражение класса //безымянный var Polygon = class { constructor(height, width) { this.height
this.width = width;
}
};
//именованный
var Polygon = class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
};

Слайд 19

Создание объекта и прототип

Constructor запускается при создании new Object, остальные методы записываются

Создание объекта и прототип Constructor запускается при создании new Object, остальные методы
в Object.prototype

class User {
constructor(name) {
this.name = name;
}
sayHi() { console.log(this.name);}
}
let user = new User("Вася");

Слайд 20

Создание объекта и прототип

function User(name) {
this.name = name;
}
User.prototype.sayHi = function() {

Создание объекта и прототип function User(name) { this.name = name; } User.prototype.sayHi
console.log(this.name);
};

Слайд 21

Всплытие (hoisting)

Разница между объявлением функции (function declaration) и объявлением класса (class declaration)

Всплытие (hoisting) Разница между объявлением функции (function declaration) и объявлением класса (class
в том, что объявление функции совершает подъём (hoisted), в то время как объявление класса — нет

var p = new Polygon();
class Polygon {}
//Uncaught ReferenceError: Polygon is not defined

Слайд 22

Статические методы

class Point {
constructor(x, y) {
this.x = x;
this.y =

Статические методы class Point { constructor(x, y) { this.x = x; this.y
y;
}
static distance(a, b) {
const dx = a.x - b.x;
const dy = a.y - b.y;
return Math.sqrt(dx*dx + dy*dy);
}
}
const p1 = new Point(5, 5);
const p2 = new Point(10, 10);
console.log(Point.distance(p1, p2));//7.07....

Слайд 23

Геттеры, сеттеры

class User {
    constructor(firstName, lastName) {
        this.firstName = firstName;
        this.lastName =

Геттеры, сеттеры class User { constructor(firstName, lastName) { this.firstName = firstName; this.lastName
lastName;
    }
    get fullName() {
        return `${this.firstName} ${this.lastName}`;
    }
    set fullName(newValue) {
        [this.firstName, this.lastName] = newValue.split(' ');
    }
};
let user = new User('Maksim', 'Hladki');
console.log(user.fullName);//Maksim Hladki
user.fullName = "Ivan Ivanov";
console.log(user.fullName);//Ivan Ivanov

Слайд 24

Пример

class Rectangle {
    constructor (width, height) {
        this._width  = width
        this._height =

Пример class Rectangle { constructor (width, height) { this._width = width this._height
height
    }
    set width  (width)  { this._width = width}
    get width  ()       { return this._width}
    set height (height) { this._height = height}
    get height ()       { return this._height}
    get area   ()       { return this._width * this._height }
}
let test = new Rectangle(50, 20);
console.log(test.area);//1000

Слайд 25

Вычисляемые имена методов

class Foo() {
myMethod() {}
}
class Foo() {
['my'+'Method']() {}
}

Вычисляемые имена методов class Foo() { myMethod() {} } class Foo() {

const m = 'myMethod';
class Foo() {
[m]() {}
}

Слайд 26

Наследование

//Только один конструктор, прототип, базовый класс!
class Child extends Parent {
//TODO logic
}

Наследование //Только один конструктор, прототип, базовый класс! class Child extends Parent { //TODO logic }

Слайд 27

Пример

class Point {
    constructor(x, y) {
        this.x = x; this.y = y;
   

Пример class Point { constructor(x, y) { this.x = x; this.y =
}
    toString() {
        return '(' + this.x + ', ' + this.y + ')';
    }
}
class ColorPoint extends Point {
    constructor(color) {
        super(0, 0);
        this.color = color;
    }
    toString() {
        return super.toString() + ' in ' + this.color;
    }
}
let cPoint = new ColorPoint('red');
console.log(cPoint.toString());//(0, 0) in red

Слайд 28

Наследование статических методов

class Foo {
static classMethod() {
return 'hello';
}
}
class Bar

Наследование статических методов class Foo { static classMethod() { return 'hello'; }
extends Foo {
//TODO
}
console.log(Bar.classMethod());//hello

Слайд 29

Super

//Используется для вызова функций, принадлежащих
//родителю объекта
super([arguments]);//вызов родительского конструктора
super.functionOnParent([arguments]);

Super //Используется для вызова функций, принадлежащих //родителю объекта super([arguments]);//вызов родительского конструктора super.functionOnParent([arguments]);

Слайд 30

Пример: вызов конструктора

class Polygon {
constructor(height, width) {
this.height = height;
this.width

Пример: вызов конструктора class Polygon { constructor(height, width) { this.height = height;
= width;
}
}
class Square extends Polygon {
constructor(length) {
super(length, length);
}
get area() {
return this.height * this.width;
}
}

Слайд 31

Вызов метода

class Foo {
static classMethod() {
return 'hello';
}
}
class Bar

Вызов метода class Foo { static classMethod() { return 'hello'; } }
extends Foo {
static classMethod() {
return super.classMethod() + ', too';
}
}
Bar.classMethod();//hello, too

Слайд 33

Mixins

// Абстрактные подклассы (mix-ins) — это шаблоны для классов.
//У класса может

Mixins // Абстрактные подклассы (mix-ins) — это шаблоны для классов. //У класса
быть только один родительский класс, поэтому
// множественное наследование невозможно.
//Функциональность должен предоставлять родительский класс
class B extends A, M {}// Uncaught SyntaxError: Unexpected token ,
// множественного наследования нет
const mixin = base => class extends base {
/* свойства и методы */
}

Слайд 34

Пример

class Person { ··· }
const Storage = Sup => class extends Sup

Пример class Person { ··· } const Storage = Sup => class
{
save(database) { ··· }
};
const Validation = Sup => class extends Sup {
validate(schema) { ··· }
};
class Employee extends Storage(Validation(Person)) { ··· }

Слайд 35

Пример

let MyMixin = (superclass) => class extends superclass {
test() {

Пример let MyMixin = (superclass) => class extends superclass { test() {
console.log('test from MyMixin');
}
};
class MyClass extends MyMixin(MyBaseClass) {
/* ... */
}
let c = new MyClass();
c.test();//test from MyMixin

Слайд 37

Тип данных Symbol

Уникальный и неизменяемый тип данных, который может быть использован

Тип данных Symbol Уникальный и неизменяемый тип данных, который может быть использован
как идентификатор для свойств объектов
Символьный объект — это объект-обертка для примитивного символьного типа

let sym = Symbol("foo");
console.log(typeof sym);//symbol
let symObj= Object(sym);
console.log(typeof symObj);//object
console.log(Symbol("name") == Symbol("name"));//false  

Слайд 38

Тип данных Symbol

let isAdmin = Symbol("isAdmin");
let user = {
name: "Вася",
[isAdmin]:

Тип данных Symbol let isAdmin = Symbol("isAdmin"); let user = { name:
true
};
console.log(user[isAdmin]);//true

Слайд 39

Тип данных Symbol

Свойство, объявленное через символ, не будет видно в for-in, Object.keys,

Тип данных Symbol Свойство, объявленное через символ, не будет видно в for-in,
Object.getOwnPropertyNames, также не будет добавлено при использовании JSON.stringify

Слайд 40

Тип данных Symbol

let user = {
name: "Вася",
age: 30,
[Symbol.for("isAdmin")]: true
};
//в

Тип данных Symbol let user = { name: "Вася", age: 30, [Symbol.for("isAdmin")]:
цикле for..in не будет символа
console.log(Object.keys(user));//["name", "age"]
//доступ к свойству через глобальный символ — работает
console.log(user[Symbol.for("isAdmin")]);//true

Слайд 41

Глобальные символы

Глобальный реестр символов позволяет иметь общие глобальные символы, которые можно получить

Глобальные символы Глобальный реестр символов позволяет иметь общие глобальные символы, которые можно
из реестра по имени. Используется метод for

//создание символа в реестре
let name = Symbol.for("name");
//символ уже есть, чтение из реестра
console.log(Symbol.for("name") == name);//true