Translate

Поиск по этому блогу

вторник, 11 сентября 2018 г.

ES6: Объекты (VIII).

Объекты в ES6

Рассмотрим нововведения, которые помогут нам работе с объектами в ES6.



Все материалы по ES6


В отличии от других языков, в JavaScript мы очень часто работаем с литералами объектов. То есть с простыми объектами, которые не являются представителями какого-либо класса, а представляют из себя набор свойств и значений.

В ES6 было добавленно несколько нововведений, которые немного упростили синтаксис при работе с простыми объектами.

Первое, что мы сделаем, это запустим скрипт Babel, который будет следить за файлами и при их изменении создавать свежие версии.

Откроем папку проекта в командной строке (КС). Вводим команду:

npm run watch


И нажать Enter

Последние версии браузеров поддерживают все новвовведения для объектов без транспиляции. Измененый код нас будет интересовать в порядке ознакомления.

В папке src создадим файл objects.js и сразу укажу его в файле index.html

<script src="src/objects.js"></script>

Начнем со свойств.

Допустим, имеется три переменные - имя, фамилия и электронная почта.


let firstName = "Bill",
    lastName = "Smit",
    email = "bill@gmail.com";



Далее, создадим объект в котором в качестве свойств мы укажем названия переменных:


let firstName = "Bill",
    lastName = "Smit",
    email = "bill@gmail.com";

let person = {
 firstName: firstName,
 lastName: lastName,
 email: email
};

console.log( person );



И в конце мы вывели значения объекта person в консоли браузера.



В ES6, если свойство совпадает с названием переменной, то мы можем указать только свойство. Значение автоматически вставится из переменной с таким же названием.

Объекст person мы можем записать так:


let person = {
 firstName,
 lastName,
 email
};



Сохраняем, и видим тотже результат, что и на фото выше.

Давайте посмотрим на то, что транспилировал Babel

dist/object.js


"use strict";

var firstName = "Bill",
    lastName = "Smit",
    email = "bill@gmail.com";

var person = {
 firstName: firstName,
 lastName: lastName,
 email: email
};

console.log(person);



Он сделал тоже самое, что у нас было изначально!

Теперь перейдем к методам

Создание методов тоже стало немного проще.

Давайте добавим нашему объекту метод.


let firstName = "Bill",
   lastName = "Smit",
   email = "bill@gmail.com";

let person = {
 firstName,
 lastName,
 email,
 say: function() {
  console.log(`Hello, my name is ${firstName} ${lastName}`);
 }
};

console.log( person );
person.say();





В ES6 мы можем немного упростить написание метода, а именно - убрать слово function и двоеточие, оставив только круглые скобки ()


 say() {
  console.log(`Hello, my name is ${firstName} ${lastName}`);
 }


В консоле мы увидим тотже самый результат.

Если посмотреть на транспилированный код, то можно увидеть то, что Babel сделал все ,как и было изначально:

dist/object.js


"use strict";

var firstName = "Bill",
    lastName = "Smit",
    email = "bill@gmail.com";

var person = {
 firstName: firstName,
 lastName: lastName,
 email: email,
 say: function say() {
  console.log("Hello, my name is " + firstName + " " + lastName);
 }
};

console.log(person);
person.say();



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

Добраться до свойства firstName объекта person мы можем используя точку - person.firstName или квадратные скобки - person['firstName'].

Если мы используем квадратные скобки, то мы можем либо строкой указать название сво-ва, либо название переменной, в которой указано это сво-во.

Создадим новую переменную в которой в качестве значения укажем название свойства.

let property = 'firstName';

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

person[property]; Это будет тоже самое, что и person['firstName'];

Теперь, если поменять значение переменной на lastName

let property = 'lastName';

Так мы получим доступ к свойству lastName

Так можно сделать только в том случае если объект уже существует!!!


Но в ES6 мы можем использовать квадратные скобки прями внутри объекта. Тем самым динамически указывать названия сво-ва.

Например:


let property = 'lastName';
person[property]; // person['firstName']
person = {
    [property]: 'Bill'
};


В данном случае person будет присвоен объект, в котором сво-ва мы указываем динамически из переменной property.

Для того, чтобы указать firstName нам нужно указать в параменной let property - 'firstName'.

Вот так:

let property = 'lastName';

и так далее. Мы можем динамически менять значение переменной.

Для более практичного примера я создам функцию createCar, которая будет принимать название свойства - property и значение свойства - value.

В функции мы создадим простой объект с одним свойством и вернем его.

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

Вначале создаем объект - var car ={}

Далее в квадратных скобках указываем его свойства car[property]

и присваеваем ему значение value

car[property] = value

И возвращаем объект - return car

Чтобы посмотреть на результат console.log(createCar('vin', 1));


function createCar( property, value ) {
 var car = {};
 car[property] = value;
 return car;
};

console.log(createCar('vin', 1));





В консоле мы увидим объект со свойством vin и значением - 1.

В ES6 мы можем указать значение свойства прямо в литерале объекта.

Поэтому мы сразу вернем объект - return

и в свойствахв квадратных скобках мы указываем переменную [property] со значением value.

[property]:value


function createCar( property, value ) {
 return{
  [property]: value
  };
};
console.log(createCar('vin', 1));



В консоле мы получим тотже самый результат.

И теперь давайте посмотри как это все сгенерировал Babel

dist/object.js

function _defineProperty(obj, key, value) { 
if (key in obj){ 
Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true });
 } 
else { 
obj[key] = value; } return obj;
 }

function createCar(property, value) {
 return _defineProperty({}, property, value);
};
console.log(createCar('vin', 1));



Функция _defineProperty обращается к глобальному объекту, чтобы создать свойства.

Благодаря новому синтаксису нам нет в этом необходимости и записи стали проще.

И, так как мы используем название переменной, у нас появились новые возможности, которых не было раньше при создании объекта.

Мы можем теперь добавить нижнее подчеркивание к названию совойства ['_' + property]: value


function createCar( property, value ) {
 return{
  [property]: value,
  ['_' + property]: value
  };
};
console.log(createCar('vin', 1));



У объекта появилось новое свойство - _vin



Или мы можем использовать метод toUpperCase()


function createCar( property, value ) {
 return{
  [property]: value,
  ['_' + property]: value,
  [property.toUpperCase()]: value
  };
};
console.log(createCar('vin', 1));



Результат - новое свойство VIN:



Можно динамически указать название метода:

function createCar( property, value ) {
 return{
  [property]: value,
  ['_' + property]: value,
  [property.toUpperCase()]: value,
  ['get' + property]() {
       return this[property];
      }
  };
};
console.log(createCar('vin', 1));



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



В JavaScript помимо свойств и методов, можно создавать специальные свойства, которые внутри объектов выглядят и работают как методы, но снаружи работаеют как свойства.

Эти суппер-свойства называются get и set или геттер и сеттер.

Давайте вернемся к объекту person и добавим ему оба этих метода.

Вначале добавим их в стиле ES5:

Чтобы добаить свойство мы воспользуемся объектом Objcts методом .defineProperty()

Первым параметром будет объект которому создаются свойства - person, а вторым параметром название свойства 'fullName', а далее принимается объект в котором это свойство описаывается.

В этом объестк первым свойством будет get - функция, которая ничего не принимает, но возвращает (this.firstName + ' ' + this.lastName).

Перед тем, как посмотреть результат я закоментирую код, который не относится к объекту person


Object.defineProperty(person, 'fullName', {
    get: function() {
        return this.firstName + ' ' + this.lastName;
    }

});



Сохраняем. Смотрим в консоле.

Теперь у нашего объекта person появилось новое свойство - fullName (на фото ниже оно подчеркнуто.

Теперь если мы обратимся к нему через точечную нотацию в консоле - person.fullName , то получим "Bill Smit", как на фото ниже в рамке.



Обратите внимание что get является функцие, но при этом мы не используем круглые скобки.

Внутри объекта - это метод, а снаружи это свойства!

Особого смысла метод set, в данном случае, не имеет, но для полноты картины, мы его определим. Его отличие от get в том. что set получает значение. Его можно назвать как угодно - это просто переменная. В нашем случае - value. В теле метода мы можем что-либо сделать - напрмер присвоить свойство this.firstName = value;


let person = {
    firstName,
    lastName,
    email,
    sayHello() {
        console.log(`Hi my name is ${this.firstName} ${this.lastName}`);
    },
    get fullName() {
        return this.firstName + ' ' + this.lastName;
    },
    set fullName(value) {
        this.firstName = value;
    }
};



Сохраним и посмотрим в консоле:



  1. - мы увидим, что у нашего объекта появились два метода (геттер и сеттер).
  2. - назначим новое значение свойству fillName - > person.fullName = "John";
  3. - вывдеме значение этого свойства - person.fullName


Для того, чтобы переписать код на ES6, все что нам нужно сделать это добавить к нашему объекту person


let person = {
    firstName,
    lastName,
    email,
    sayHello() {
        console.log(`Hi my name is ${this.firstName} ${this.lastName}`);
    },
    get fullName() {
        return this.firstName + ' ' + this.lastName;
    },
    set fullName(value) {
        this.firstName = value;
    }
};



Результат в консоли будет тот же.



Чаще всего свойства get и set не присваиваются простым объектам. Они присваиваются, как правило, объектам - представителям какого-нибудь класса.

В ES6 добавили поддержку классов. О них мы поговорим позже.



                                                                                                                                                             

Комментариев нет:

Отправить комментарий



Хотите освоить самые современные методы написания React приложений? Надоели простые проекты? Нужны курсы, книги, руководства, индивидуальные занятия по React и не только? Хотите стать разработчиком полного цикла, освоить стек MERN, или вы только начинаете свой путь в программировании, и не знаете с чего начать, то пишите через форму связи, подписывайтесь на мой канал в Телеге, вступайте в группу на Facebook.Пишите мне - kolesnikovy70 почта gmail.com