Объекты в 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;
}
};
Сохраним и посмотрим в консоле:
- - мы увидим, что у нашего объекта появились два метода (геттер и сеттер).
- - назначим новое значение свойству
fillName
- >person.fullName = "John";
- - вывдеме значение этого свойства -
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 добавили поддержку классов. О них мы поговорим позже.
Комментариев нет:
Отправить комментарий