Ð ÑÑом Ñазделе Ð¼Ñ ÑаÑÑмоÑÑим нововведениÑ, коÑоÑÑе каÑаÑÑÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ обÑекÑов.
Ðо клаÑÑам â ÑÑÑÑ Ð¿Ð¾Ð·Ð¶Ðµ, в оÑделÑном Ñазделе, оно Ñого заÑлÑживаеÑ.
ÐоÑоÑкое ÑвойÑÑво
ÐаÑаÑÑÑÑ Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð¿ÐµÑеменнÑе, напÑимеÑ, name и isAdmin, и Ð¼Ñ Ñ
оÑим иÑполÑзоваÑÑ Ð¸Ñ
в обÑекÑе.
ÐÑи обÑÑвлении обÑекÑа в ÑÑом ÑлÑÑае доÑÑаÑоÑно ÑказаÑÑ ÑолÑко Ð¸Ð¼Ñ ÑвойÑÑва, а знаÑение бÑÐ´ÐµÑ Ð²Ð·ÑÑо из пеÑеменной Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ÑнÑм именем.
ÐапÑимеÑ:
'use strict';
let name = "ÐаÑÑ";
let isAdmin = true;
let user = {
name,
isAdmin
};
alert( JSON.stringify(user) ); // {"name": "ÐаÑÑ", "isAdmin": true}
ÐÑÑиÑлÑемÑе ÑвойÑÑва
РкаÑеÑÑве имени ÑвойÑÑва можно иÑполÑзоваÑÑ Ð²ÑÑажение, напÑимеÑ:
'use strict';
let propName = "firstName";
let user = {
[propName]: "ÐаÑÑ"
};
alert( user.firstName ); // ÐаÑÑ
Ðли даже Ñак:
'use strict';
let a = "Ðой ";
let b = "ÐелÑнÑй ";
let c = "ÐÑокодил";
let user = {
[(a + b + c).toLowerCase()]: "Ðена"
};
alert( user["мой зелÑнÑй кÑокодил"] ); // Ðена
ÐеÑÑеÑ-ÑеÑÑÐµÑ Ð´Ð»Ñ Ð¿ÑоÑоÑипа
Ð ES5 Ð´Ð»Ñ Ð¿ÑоÑоÑипа бÑл меÑод-геÑÑеÑ:
Object.getPrototypeOf(obj)
Ð ES-2015 Ñакже добавилÑÑ ÑеÑÑеÑ:
Object.setPrototypeOf(obj, newProto)
â¦Ð Ñакже «Ñзаконено» ÑвойÑÑво __proto__, коÑоÑое даÑÑ Ð¿ÑÑмой доÑÑÑп к пÑоÑоÑипÑ. Ðго, в каÑеÑÑве «неÑÑандаÑÑного», но Ñдобного ÑпоÑоба ÑабоÑÑ Ñ Ð¿ÑоÑоÑипом, Ñеализовали поÑÑи вÑе бÑаÑзеÑÑ (кÑоме IE10-), Ñак ÑÑо бÑло пÑинÑÑо ÑеÑение добавиÑÑ ÐµÐ³Ð¾ в ÑÑандаÑÑ.
Object.assign
ФÑнкÑÐ¸Ñ Object.assign полÑÑÐ°ÐµÑ ÑпиÑок обÑекÑов и копиÑÑÐµÑ Ð² пеÑвÑй target ÑвойÑÑва из оÑÑалÑнÑÑ
.
СинÑакÑиÑ:
Object.assign(target, src1, src2...)
ÐÑи ÑÑом поÑледÑÑÑие ÑвойÑÑва пеÑезапиÑÑваÑÑ Ð¿ÑедÑдÑÑие.
ÐапÑимеÑ:
'use strict';
let user = { name: "ÐаÑÑ" };
let visitor = { isAdmin: false, visits: true };
let admin = { isAdmin: true };
Object.assign(user, visitor, admin);
// user <- visitor <- admin
alert( JSON.stringify(user) ); // name: ÐаÑÑ, visits: true, isAdmin: true
Ðго Ñакже можно иÑполÑзоваÑÑ Ð´Ð»Ñ 1-ÑÑовневого клониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑа:
'use strict';
let user = { name: "ÐаÑÑ", isAdmin: false };
// clone = пÑÑÑой обÑÐµÐºÑ + вÑе ÑвойÑÑва user
let clone = Object.assign({}, user);
Object.is(value1, value2)
ÐÐ¾Ð²Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¿ÑовеÑки ÑавенÑÑва знаÑений.
ÐозвÑаÑÐ°ÐµÑ true, еÑли знаÑÐµÐ½Ð¸Ñ value1 и value2 ÑавнÑ, инаÑе false.
Ðна поÑ
ожа на обÑÑное ÑÑÑогое ÑавенÑÑво ===, но еÑÑÑ Ð¾ÑлиÑиÑ:
// СÑавнение +0 и -0
alert( Object.is(+0, -0)); // false
alert( +0 === -0 ); // true
// СÑавнение Ñ NaN
alert( Object.is(NaN, NaN) ); // true
alert( NaN === NaN ); // false
ÐÑлиÑÐ¸Ñ ÑÑи в болÑÑинÑÑве ÑиÑÑаÑий некÑиÑиÑнÑ, Ñак ÑÑо не поÑ
оже, ÑÑÐ¾Ð±Ñ ÑÑа ÑÑнкÑÐ¸Ñ Ð²ÑÑеÑнила обÑÑнÑÑ Ð¿ÑовеÑÐºÑ ===. ЧÑо инÑеÑеÑно â ÑÑÐ¾Ñ Ð°Ð»Ð³Ð¾ÑиÑм ÑÑавнениÑ, коÑоÑÑй назÑваеÑÑÑ SameValue, пÑименÑеÑÑÑ Ð²Ð¾ внÑÑÑенниÑ
ÑеализаÑиÑÑ
ÑазлиÑнÑÑ
меÑодов ÑовÑеменного ÑÑандаÑÑа.
ÐеÑÐ¾Ð´Ñ Ð¾Ð±ÑекÑа
Ðолгое вÑÐµÐ¼Ñ Ð² JavaScript ÑеÑмин «меÑод обÑекÑа» бÑл пÑоÑÑо алÑÑеÑнаÑивнÑм названием Ð´Ð»Ñ ÑвойÑÑва-ÑÑнкÑии.
ТепеÑÑ ÑÑо Ñже не Ñак. ÐÐ¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ «меÑÐ¾Ð´Ñ Ð¾Ð±ÑекÑа», коÑоÑÑе, по ÑÑÑи, ÑвлÑÑÑÑÑ ÑвойÑÑвами-ÑÑнкÑиÑми, пÑивÑзаннÑми к обÑекÑÑ.
ÐÑ Ð¾ÑобенноÑÑи:
- Ðолее коÑоÑкий ÑинÑакÑÐ¸Ñ Ð¾Ð±ÑÑвлениÑ.
- ÐалиÑие в меÑодаÑ
ÑпеÑиалÑного внÑÑÑеннего ÑвойÑÑва
[[HomeObject]](«домаÑний обÑекÑ»), ÑÑÑлаÑÑегоÑÑ Ð½Ð° обÑекÑ, коÑоÑÐ¾Ð¼Ñ Ð¼ÐµÑод пÑинадлежиÑ. ÐÑ Ð¿Ð¾ÑмоÑÑим его иÑполÑзование ÑÑÑÑ Ð´Ð°Ð»ÑÑе.
ÐÐ»Ñ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¼ÐµÑода вмеÑÑо запиÑи "prop: function() {â¦}" нÑжно напиÑаÑÑ Ð¿ÑоÑÑо "prop() { ⦠}".
ÐапÑимеÑ:
'use strict';
let name = "ÐаÑÑ";
let user = {
name,
// вмеÑÑо "sayHi: function() {...}" пиÑем "sayHi() {...}"
sayHi() {
alert(this.name);
}
};
user.sayHi(); // ÐаÑÑ
Ðак видно, Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼ÐµÑода нÑжно пиÑаÑÑ Ð¼ÐµÐ½ÑÑе бÑкв. ЧÑо же каÑаеÑÑÑ Ð²Ñзова â он ниÑем не оÑлиÑаеÑÑÑ Ð¾Ñ Ð¾Ð±ÑÑной ÑÑнкÑии. Ðа данном ÑÑапе можно ÑÑиÑаÑÑ, ÑÑо «меÑод» â ÑÑо пÑоÑÑо ÑокÑаÑÑннÑй ÑинÑакÑÐ¸Ñ Ð´Ð»Ñ ÑвойÑÑва-ÑÑнкÑии. ÐополниÑелÑнÑе возможноÑÑи, коÑоÑÑе даÑÑ Ñакое обÑÑвление, Ð¼Ñ ÑаÑÑмоÑÑим позже.
Также меÑодами ÑÑанÑÑ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð³ÐµÑÑеÑов get prop() и ÑеÑÑеÑов set prop():
'use strict';
let name = "ÐаÑÑ", surname="ÐеÑÑов";
let user = {
name,
surname,
get fullName() {
return `${name} ${surname}`;
}
};
alert( user.fullName ); // ÐаÑÑ ÐеÑÑов
Ðожно задаÑÑ Ð¸ меÑод Ñ Ð²ÑÑиÑлÑемÑм названием:
'use strict';
let methodName = "getFirstName";
let user = {
// в квадÑаÑнÑÑ
ÑкобкаÑ
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ñбое вÑÑажение,
// коÑоÑое должно веÑнÑÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ меÑода
[methodName]() { // вмеÑÑо [methodName]: function() {
return "ÐаÑÑ";
}
};
alert( user.getFirstName() ); // ÐаÑÑ
ÐÑак, Ð¼Ñ ÑаÑÑмоÑÑели ÑинÑакÑиÑеÑкие ÑлÑÑÑениÑ. ÐÑли коÑоÑко, Ñо не надо пиÑаÑÑ Ñлово «function». ТепеÑÑ Ð¿ÐµÑейдÑм к дÑÑгим оÑлиÑиÑм.
super
Ð ES-2015 поÑвилоÑÑ Ð½Ð¾Ð²Ð¾Ðµ клÑÑевое Ñлово super. Ðно пÑедназнаÑено ÑолÑко Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² меÑодаÑ
обÑекÑа.
ÐÑзов super.parentProperty позволÑÐµÑ Ð¸Ð· меÑода обÑекÑа полÑÑиÑÑ ÑвойÑÑво его пÑоÑоÑипа.
ÐапÑимеÑ, в коде ниже rabbit наÑледÑÐµÑ Ð¾Ñ animal.
ÐÑзов super.walk() из меÑода обÑекÑа rabbit обÑаÑаеÑÑÑ Ðº animal.walk():
'use strict';
let animal = {
walk() {
alert("I'm walking");
}
};
let rabbit = {
__proto__: animal,
walk() {
alert(super.walk); // walk() { ⦠}
super.walk(); // I'm walking
}
};
rabbit.walk();
Ðак пÑавило, ÑÑо иÑполÑзÑеÑÑÑ Ð² клаÑÑаÑ
, коÑоÑÑе Ð¼Ñ ÑаÑÑмоÑÑим в ÑледÑÑÑем Ñазделе, но важно понимаÑÑ, ÑÑо «клаÑÑÑ» здеÑÑ Ð½Ð° Ñамом деле ни пÑи ÑÑм. СвойÑÑво super ÑабоÑÐ°ÐµÑ ÑеÑез пÑоÑоÑип, на ÑÑовне меÑодов обÑекÑа.
ÐÑи обÑаÑении ÑеÑез super иÑполÑзÑеÑÑÑ [[HomeObject]] ÑекÑÑего меÑода, и Ð¾Ñ Ð½ÐµÐ³Ð¾ беÑÑÑÑÑ __proto__. ÐоÑÑÐ¾Ð¼Ñ super ÑабоÑÐ°ÐµÑ ÑолÑко внÑÑÑи меÑодов.
Ð ÑаÑÑноÑÑи, еÑли пеÑепиÑаÑÑ ÑÑÐ¾Ñ ÐºÐ¾Ð´, оÑоÑмив rabbit.walk как обÑÑное ÑвойÑÑво-ÑÑнкÑиÑ, Ñо бÑÐ´ÐµÑ Ð¾Ñибка:
'use strict';
let animal = {
walk() {
alert("I'm walking");
}
};
let rabbit = {
__proto__: animal,
walk: function() { // Ðадо: walk() {
super.walk(); // ÐÑÐ´ÐµÑ Ð¾Ñибка!
}
};
rabbit.walk();
ÐÑибка возникнеÑ, Ñак как rabbit.walk ÑепеÑÑ Ð¾Ð±ÑÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¸ не Ð¸Ð¼ÐµÐµÑ [[HomeObject]]. ÐоÑÑÐ¾Ð¼Ñ Ð² ней не ÑабоÑÐ°ÐµÑ super.
ÐÑклÑÑением из ÑÑого пÑавила ÑвлÑÑÑÑÑ ÑÑнкÑии-ÑÑÑелки. РниÑ
иÑполÑзÑеÑÑÑ super внеÑней ÑÑнкÑии. ÐапÑимеÑ, здеÑÑ ÑÑнкÑиÑ-ÑÑÑелка в setTimeout беÑÑÑ Ð²Ð½ÐµÑний super:
'use strict';
let animal = {
walk() {
alert("I'm walking");
}
};
let rabbit = {
__proto__: animal,
walk() {
setTimeout(() => super.walk()); // I'm walking
}
};
rabbit.walk();
Ранее Ð¼Ñ Ð³Ð¾Ð²Ð¾Ñили о Ñом, ÑÑо Ñ ÑÑнкÑий-ÑÑÑелок Ð½ÐµÑ Ñвоего this, arguments: они иÑполÑзÑÑÑ Ñе, коÑоÑÑе во внеÑней ÑÑнкÑии. ТепеÑÑ Ðº ÑÑÐ¾Ð¼Ñ ÑпиÑÐºÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð»ÑÑ ÐµÑÑ Ð¸ super.
[[HomeObject]] â не изменÑемоеÐÑи Ñоздании меÑода â он пÑивÑзан к ÑÐ²Ð¾ÐµÐ¼Ñ Ð¾Ð±ÑекÑÑ Ð½Ð°Ð²Ñегда. ТеÑ
ниÑеÑки можно даже ÑкопиÑоваÑÑ ÐµÐ³Ð¾ и запÑÑÑиÑÑ Ð¾ÑделÑно, и super пÑÐ¾Ð´Ð¾Ð»Ð¶Ð¸Ñ ÑабоÑаÑÑ:
'use strict';
let animal = {
walk() { alert("I'm walking"); }
};
let rabbit = {
__proto__: animal,
walk() {
super.walk();
}
};
let walk = rabbit.walk; // ÑкопиÑÑем меÑод в пеÑеменнÑÑ
walk(); // вÑÐ·Ð¾Ð²ÐµÑ animal.walk()
// I'm walking
РпÑимеÑе вÑÑе меÑод walk() запÑÑкаеÑÑÑ Ð¾ÑделÑно Ð¾Ñ Ð¾Ð±ÑекÑа, но вÑÑ Ñавно, благодаÑÑ [[HomeObject]], ÑоÑ
ÑанÑеÑÑÑ Ð´Ð¾ÑÑÑп к его пÑоÑоÑÐ¸Ð¿Ñ ÑеÑез super.
ÐÑо â ÑкоÑее ÑеÑ
ниÑеÑкий моменÑ, Ñак как меÑÐ¾Ð´Ñ Ð¾Ð±ÑекÑа, вÑÑ Ð¶Ðµ, пÑедназнаÑÐµÐ½Ñ Ð´Ð»Ñ Ð²Ñзова в конÑекÑÑе ÑÑого обÑекÑа. Ð ÑаÑÑноÑÑи, пÑавила Ð´Ð»Ñ this в меÑодаÑ
â Ñе же, ÑÑо и Ð´Ð»Ñ Ð¾Ð±ÑÑнÑÑ
ÑÑнкÑий. РпÑимеÑе вÑÑе пÑи вÑзове walk() без обÑекÑа this бÑÐ´ÐµÑ undefined.
ÐÑого
УлÑÑÑÐµÐ½Ð¸Ñ Ð² опиÑании ÑвойÑÑв:
- ÐапиÑÑ
name: nameможно замениÑÑ Ð½Ð° пÑоÑÑоname - ÐÑли Ð¸Ð¼Ñ ÑвойÑÑва наÑ
одиÑÑÑ Ð² пеÑеменной или задано вÑÑажением
expr, Ñо его можно ÑказаÑÑ Ð² квадÑаÑнÑÑ ÑкобкаÑ[expr]. - СвойÑÑва-ÑÑнкÑии можно оÑоÑмиÑÑ ÐºÐ°Ðº меÑодÑ:
"prop: function() {}"â"prop() {}".
РмеÑодаÑ
ÑабоÑÐ°ÐµÑ Ð¾Ð±ÑаÑение к ÑвойÑÑвам пÑоÑоÑипа ÑеÑез super.parentProperty.
ÐÐ»Ñ ÑабоÑÑ Ñ Ð¿ÑоÑоÑипом:
Object.setPrototypeOf(obj, proto)â меÑод Ð´Ð»Ñ ÑÑÑановки пÑоÑоÑипа.obj.__proto__â ÑÑÑлка на пÑоÑоÑип.
ÐополниÑелÑно:
- ÐеÑод
Object.assign(target, src1, src2...)â копиÑÑÐµÑ ÑвойÑÑва из вÑÐµÑ Ð°ÑгÑменÑов в пеÑвÑй обÑекÑ. - ÐеÑод
Object.is(value1, value2)пÑовеÑÑÐµÑ Ð´Ð²Ð° знаÑÐµÐ½Ð¸Ñ Ð½Ð° ÑавенÑÑво. РоÑлиÑие оÑ===ÑÑиÑаеÑ+0и-0ÑазнÑми ÑиÑлами. Ð Ñакже ÑÑиÑаеÑ, ÑÑоNaNÑавно ÑÐ°Ð¼Ð¾Ð¼Ñ Ñебе.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)