РпеÑÑÑй Ð³Ð»Ð°Ð²Ñ ÑÑого ÑоздÑлÑ, ми згадÑвали ÑÑÑаÑÐ½Ñ Ð¼ÐµÑоди ÑобоÑи з пÑоÑоÑипом.
ÐÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ ÑиÑÐ°Ð½Ð½Ñ Ð¿ÑоÑоÑÐ¸Ð¿Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ obj.__proto__ вважаÑÑÑÑÑ Ð·Ð°ÑÑаÑÑлим Ñ Ð½Ðµ ÑекомендÑÑÑÑÑÑ Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑÐ°Ð½Ð½Ñ Ð² майбÑÑнÑÐ¾Ð¼Ñ (пеÑенеÑено до Ñак званого âAnnex Bâ ÑÑандаÑÑÑ JavaScript, пÑизнаÑеного лиÑе Ð´Ð»Ñ Ð±ÑаÑзеÑÑв).
СÑÑаÑÐ½Ñ Ð¼ÐµÑоди оÑÑиманнÑ/вÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿ÑоÑоÑипÑ:
- Object.getPrototypeOf(obj) â повеÑÑÐ°Ñ Ð·Ð½Ð°ÑеннÑ
[[Prototype]]обâÑкÑÑobj. - Object.setPrototypeOf(obj, proto) â вÑÑановлÑÑ Ð·Ð½Ð°ÑеннÑ
[[Prototype]]обâÑкÑÑobjÑÑвнеproto.
Ðдине викоÑиÑÑÐ°Ð½Ð½Ñ __proto__, Ñке не Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ Ð½ÐµÐ³Ð°Ñивного ÑÑавленнÑ, Ñе Ñк влаÑÑивÑÑÑÑ Ð¿Ñд ÑÐ°Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ обâÑкÑа: { __proto__: ... }.
ХоÑа Ñ Ð´Ð»Ñ ÑÑого Ñ ÑпеÑÑалÑний меÑод:
- Object.create(proto[, descriptors]) â ÑÑвоÑÑÑ Ð¿Ð¾ÑожнÑй обâÑÐºÑ Ñз заданим
protoÑк[[Prototype]]Ñ Ð½ÐµÐ¾Ð±Ð¾Ð²âÑзковими деÑкÑипÑоÑами влаÑÑивоÑÑей.
ÐапÑиклад:
let animal = {
eats: true
};
// ÑÑвоÑÑÑÑÑÑÑ Ð½Ð¾Ð²Ð¸Ð¹ обâÑÐºÑ Ð· пÑоÑоÑипом animal
let rabbit = Object.create(animal); // same as {__proto__: animal}
alert(rabbit.eats); // true
alert(Object.getPrototypeOf(rabbit) === animal); // true
Object.setPrototypeOf(rabbit, {}); // змÑнÑÑ Ð¿ÑоÑоÑип обâÑкÑÑ rabbit на {}
Object.create Ð¼Ð°Ñ Ð½ÐµÐ¾Ð±Ð¾Ð²âÑзковий дÑÑгий аÑгÑменÑ: деÑкÑипÑоÑи влаÑÑивоÑÑей.
Ðи можемо надаÑи додаÑÐºÐ¾Ð²Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ Ð½Ð¾Ð²Ð¾Ð¼Ñ Ð¾Ð±âÑкÑÑ, Ñк ÑÑÑ:
let animal = {
eats: true
};
let rabbit = Object.create(animal, {
jumps: {
value: true
}
});
alert(rabbit.jumps); // true
ФоÑÐ¼Ð°Ñ Ð´ÐµÑкÑипÑоÑÑв опиÑаний в ÑÑй Ð³Ð»Ð°Ð²Ñ ÐÑапоÑи Ñа деÑкÑипÑоÑи влаÑÑивоÑÑей.
Ðи можемо викоÑиÑÑаÑи Object.create, Ñоб клонÑваÑи обâÑÐºÑ ÐµÑекÑивнÑÑе нÑж Ñиклом for..in:
let clone = Object.create(
Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj)
);
Таким Ñином ми ÑÑвоÑÑÑмо ÑпÑÐ°Ð²Ð¶Ð½Ñ ÐºÐ¾Ð¿ÑÑ Ð¾Ð±âÑкÑа obj, вклÑÑаÑÑи вÑÑ Ð²Ð»Ð°ÑÑивоÑÑÑ: пеÑелÑÑÑÐ²Ð°Ð½Ñ Ñа не пеÑелÑÑÑванÑ, ÑеÑеÑи/геÑеÑи â з пÑавилÑним знаÑеннÑм [[Prototype]].
ÐоÑоÑка ÑÑÑоÑÑÑ
ЯкÑо поÑаÑ
ÑваÑи вÑÑ ÑпоÑоби кеÑÑÐ²Ð°Ð½Ð½Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ [[Prototype]], ÑÑ
бÑде багаÑо! ÐагаÑо ÑпоÑобÑв ÑобиÑи одне й Ñе ж Ñаме! Як Ñак ÑÑалоÑÑ? ЧомÑ?
Так ÑклалоÑÑ ÑÑÑоÑиÑно.
ÐÑоÑоÑипна ÑпадковÑÑÑÑ Ð±Ñла в Ð¼Ð¾Ð²Ñ Ð· Ñамого поÑаÑкÑ, але ÑпоÑоби кеÑÑÐ²Ð°Ð½Ð½Ñ Ð½ÐµÑ ÑозвивалиÑÑ Ð· ÑаÑом.
- ÐлаÑÑивÑÑÑÑ
prototypeÑÑнкÑÑÑ-конÑÑÑÑкÑоÑа пÑаÑÑвала з дÑже давнÑÑ ÑаÑÑв. Це найÑÑаÑÑÑий ÑпоÑÑб ÑÑвоÑÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑÑв Ñз заданим пÑоÑоÑипом. - ÐÑзнÑÑе, в 2012 ÑоÑÑ, меÑод
Object.createÑÑав ÑÑандаÑÑом. Це дало можливÑÑÑÑ ÑÑвоÑÑваÑи обâÑкÑи з певним пÑоÑоÑипом, пÑоÑе не дозволÑло оÑÑимÑваÑи або вÑÑановлÑваÑи його. Ð¢Ð¾Ð¼Ñ Ð±ÑаÑзеÑи ÑеалÑзÑвали не ÑÑандаÑÑний акÑеÑоÑ__proto__, Ñо дозволÑв коÑиÑÑÑваÑÑ Ð¾ÑÑимÑваÑи Ñа вÑÑановлÑваÑи пÑоÑоÑип в бÑдÑ-Ñкий ÑаÑ, Ñоб надаÑи ÑозÑобникам бÑлÑÑе гнÑÑкоÑÑÑ. - Ще пÑзнÑÑе, в 2015 ÑоÑÑ, меÑоди
Object.setPrototypeOfÑаObject.getPrototypeOfбÑли Ð´Ð¾Ð´Ð°Ð½Ñ Ð´Ð¾ ÑÑандаÑÑÑ, Ð´Ð»Ñ Ñого, Ñоб виконÑваÑи аналогÑÑÐ½Ñ ÑÑнкÑÑоналÑнÑÑÑÑ Ñк Ñ__proto__. ÐÑкÑлÑки__proto__бÑло ÑиÑоко ÑеалÑзовано, воно згадÑÑÑÑÑÑ Ð² Annex B ÑÑандаÑÑÑ Ñк не обовâÑзкове Ð´Ð»Ñ Ð½Ðµ-бÑаÑзеÑÐ½Ð¸Ñ ÑеÑедовиÑ, але вважаÑÑÑÑÑ Ñвого ÑÐ¾Ð´Ñ Ð·Ð°ÑÑаÑÑлим. - ÐÑзнÑÑе, Ñ 2022 ÑоÑÑ, бÑло оÑÑÑÑйно дозволено викоÑиÑÑовÑваÑи
__proto__в обâÑкÑÐ½Ð¸Ñ Ð»ÑÑеÑалаÑ{...}(винеÑено з Annex B), але не Ñк геÑÑеÑ/ÑеÑÑеÑobj.__proto__(ÑÑ Ð¼Ð¾Ð¶Ð»Ð¸Ð²ÑÑÑÑ Ð²Ñе Ñе в Annex B).
Ð§Ð¾Ð¼Ñ __proto__ бÑло замÑнено меÑодами getPrototypeOf/setPrototypeOf?
Ð§Ð¾Ð¼Ñ __proto__ бÑло ÑаÑÑково вÑдновлено Ñ Ð¹Ð¾Ð³Ð¾ викоÑиÑÑÐ°Ð½Ð½Ñ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾ в {...}, але не Ñк геÑÑеÑ/ÑеÑÑеÑ?
Це ÑÑкаве запиÑаннÑ, Ñке Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ Ð²Ñд Ð½Ð°Ñ ÑозÑмÑннÑ, ÑÐ¾Ð¼Ñ __proto__ поганий.
РнезабаÑом ми оÑÑимаÑмо вÑдповÑдÑ.
[[Prototype]] в ÑÑнÑÑÑиÑ
обâÑкÑÑв, ÑкÑо ÑвидкÑÑÑÑ Ð²Ð°Ð¶Ð»Ð¸Ð²Ð°Ð¢ÐµÑ
нÑÑно, ми можемо оÑÑимаÑи/вÑÑановиÑи [[Prototype]] в бÑдÑ-Ñкий моменÑ. Ðле зазвиÑай ми ÑÑлÑки вÑÑановлÑÑмо його один Ñаз пÑд ÑÐ°Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð¾Ð±âÑкÑÑ Ñа бÑлÑÑе не змÑнÑÑмо: rabbit наÑлÑдÑÑÑÑÑÑ Ð²Ñд animal Ñ Ñе не змÑниÑÑÑÑ.
JavaScript ÑÑÑÑй Ñ Ð²Ð¸Ñоко опÑимÑзованим Ð´Ð»Ñ ÑÑого. ÐмÑна пÑоÑоÑÐ¸Ð¿Ñ âна лÑоÑÑâ за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Object.setPrototypeOf або obj.__proto__= дÑже повÑлÑна опеÑаÑÑÑ, Ñка поÑÑÑÑÑ Ð²Ð½ÑÑÑÑÑÐ½Ñ Ð¾Ð¿ÑимÑзаÑÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑÑÑ Ð· доÑÑÑÐ¿Ñ Ð´Ð¾ влаÑÑивоÑÑÑ Ð¾Ð±âÑкÑа. Щоб ÑникнÑÑи ÑÑого, ви маÑÑе ÑозÑмÑÑи Ñо ви ÑобиÑе Ñ Ð´Ð»Ñ Ñого або ÑвидкодÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ JavaScript ÐºÐ¾Ð´Ñ Ð¿Ð¾Ð²Ð½ÑÑÑÑ Ð½Ðµ важлива Ð´Ð»Ñ Ð²Ð°Ñ.
"ÐÑоÑÑÑ" обâÑкÑи
Як ми знаÑмо, обâÑкÑи можÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑиÑÑ Ñк аÑоÑÑаÑÐ¸Ð²Ð½Ñ Ð¼Ð°Ñиви Ð´Ð»Ñ Ð·Ð±ÐµÑÑÐ³Ð°Ð½Ð½Ñ Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑеннÑ.
â¦ÐÑоÑе ÑкÑо ми ÑпÑобÑÑмо збеÑегÑи ÑÑвоÑÐµÐ½Ñ ÐºÐ¾ÑиÑÑÑваÑем клÑÑÑ Ð² нÑÐ¾Ð¼Ñ (напÑиклад, Ñловник з коÑиÑÑÑваÑÑким вводом), ми можемо ÑпоÑÑеÑÑгаÑи ÑÑкавий збÑй: ÑÑÑ ÐºÐ»ÑÑÑ Ð¿ÑаÑÑÑÑÑ Ð¿ÑавилÑно окÑÑм "__proto__".
РозглÑнÑÑе пÑиклад:
let obj = {};
let key = prompt("ÐведÑÑÑ ÐºÐ»ÑÑ", "__proto__");
obj[key] = "певне знаÑеннÑ";
alert(obj[key]); // [object Object], не "певне знаÑеннÑ"!
ТÑÑ, ÑкÑо коÑиÑÑÑÐ²Ð°Ñ Ð²Ð²Ð¾Ð´Ð¸ÑÑ __proto__, пÑизнаÑÐµÐ½Ð½Ñ Ð² ÑÑÐ´ÐºÑ 4 ÑгноÑÑÑÑÑÑÑ!
Це, безÑмовно, може бÑÑи дивним Ð´Ð»Ñ Ð½ÐµÑозÑобника, але доÑиÑÑ Ð·ÑозÑмÑлим Ð´Ð»Ñ Ð½Ð°Ñ. ÐлаÑÑивÑÑÑÑ __proto__ Ñ Ð¾ÑобливоÑ: вона Ð¼Ð°Ñ Ð±ÑÑи або обâÑкÑом, або null. Ð Ñдок не може ÑÑаÑи пÑоÑоÑипом. ÐÑÑ ÑÐ¾Ð¼Ñ Ð¿ÑизнаÑÐµÐ½Ð½Ñ ÑÑдка __proto__ ÑгноÑÑÑÑÑÑÑ.
ÐÑоÑе ми не намагалиÑÑ ÑеалÑзÑваÑи ÑÐ°ÐºÑ Ð¿Ð¾Ð²ÐµÐ´ÑнкÑ. Ðи Ñ
оÑÑли збеÑегÑи паÑи клÑÑ/знаÑÐµÐ½Ð½Ñ Ñ Ð¿Ñи ÑÑÐ¾Ð¼Ñ ÐºÐ»ÑÑ Ð· Ð½Ð°Ð·Ð²Ð¾Ñ "__proto__" не збеÑÑгÑÑ. Ð¢Ð¾Ð¼Ñ Ñе помилка!
ТÑÑ Ð½Ð°ÑлÑдки не ÑÐ°ÐºÑ ÑÑÑаÑнÑ. Ðле в ÑнÑиÑ
випадкаÑ
ми можемо збеÑÑгаÑи обâÑкÑи замÑÑÑÑ ÑÑдкÑв Ñ obj, Ñ ÑÐ¾Ð´Ñ Ð¿ÑоÑоÑип ÑпÑÐ°Ð²Ð´Ñ Ð±Ñде змÑнено. У ÑезÑлÑÑаÑÑ ÐºÐ¾Ð´ вÑдпÑаÑÑÑ Ð·Ð¾Ð²ÑÑм неÑподÑваним Ñином.
ÐайгÑÑÑе в ÑÑÐ¾Ð¼Ñ â зазвиÑай ÑозÑобники не задÑмаÑÑÑÑÑ Ð½Ð°Ð´ Ñим, Ñо Ñака ÑиÑÑаÑÑÑ Ð²Ð·Ð°Ð³Ð°Ð»Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð°. Це ÑобиÑÑ Ð¿Ð¾Ð´ÑÐ±Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ важкими Ð´Ð»Ñ Ð²Ð¸ÑÐ²Ð»ÐµÐ½Ð½Ñ Ñ Ð¿ÐµÑеÑвоÑÑÑÑÑÑÑ ÑÑ Ñ Ð²ÑазливоÑÑÑ, оÑобливо коли JavaScript викоÑиÑÑовÑÑÑÑÑÑ Ð½Ð° ÑÑоÑÐ¾Ð½Ñ ÑеÑвеÑÑ.
ÐеоÑÑкÑÐ²Ð°Ð½Ñ ÑеÑÑ Ñакож можÑÑÑ ÑÑаÑиÑÑ Ð¿Ñд ÑÐ°Ñ Ð¿ÑизнаÑÐµÐ½Ð½Ñ obj.toString, оÑкÑлÑки Ñе вбÑдований меÑод обâÑкÑа.
Як ми можемо ÑникнÑÑи ÑÑÑÑ Ð¿Ñоблеми?
РпеÑÑÑ ÑеÑгÑ, Ð´Ð»Ñ Ð·Ð±ÐµÑÑÐ³Ð°Ð½Ð½Ñ Ð¼Ð¸ можемо пÑоÑÑо викоÑиÑÑовÑваÑи Map замÑÑÑÑ Ð¿ÑоÑÑиÑ
обâÑкÑÑв, ÑÐ¾Ð´Ñ Ð²Ñе пÑаÑÑÑ Ð¿ÑавилÑно:
let map = new Map();
let key = prompt("What's the key?", "__proto__");
map.set(key, "some value");
alert(map.get(key)); // "some value" (Ñк Ñ Ð¿ÐµÑедбаÑалоÑÑ)
â¦Ðле ÑинÑакÑÐ¸Ñ Object ÑаÑÑо бÑлÑÑ Ð¿Ñивабливий, оÑкÑлÑки вÑн бÑлÑÑ ÑÑиÑлий.
Ðа ÑаÑÑÑ, ми можемо викоÑиÑÑовÑваÑи обâÑкÑи, ÑÐ¾Ð¼Ñ Ñо ÑвоÑÑÑ Ð¼Ð¾Ð²Ð¸ давно подÑмали пÑо ÑÑ Ð¿ÑоблемÑ.
__proto__ не Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ Ð¾Ð±âÑкÑÑ, але Ñ Ð°ÐºÑеÑоÑом Object.prototype:
Таким Ñином, ÑкÑо obj.__proto__ зÑиÑÑÑÑÑÑÑ Ð°Ð±Ð¾ вÑÑановлÑÑÑÑÑÑ, вÑдповÑдний геÑеÑ/ÑеÑÐµÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑÑÑÑÑ Ð· пÑоÑоÑÐ¸Ð¿Ñ Ñа оÑÑимÑÑ/вÑÑановлÑÑ [[Prototype]].
Як бÑло Ñказано на поÑаÑÐºÑ ÑÑого ÑоздÑлÑ: __proto__ Ñе ÑпоÑÑб доÑÑÑÐ¿Ñ Ð´Ð¾ [[Prototype]], але не Ñ Ñамим [[Prototype]].
ТепеÑ, коли ми Ñ Ð¾Ñемо викоÑиÑÑаÑи обâÑÐºÑ Ñк аÑоÑÑаÑивний маÑив Ñа ÑникнÑÑи ÑÐ°ÐºÐ¸Ñ Ð¿Ñоблем, ми можемо зÑобиÑи Ñе за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð½ÐµÐ²ÐµÐ»Ð¸ÐºÐ¾Ñ Ñ Ð¸ÑÑоÑÑÑ:
let obj = Object.create(null);
// or: obj = { __proto__: null }
let key = prompt("ÐведÑÑÑ ÐºÐ»ÑÑ", "__proto__");
obj[key] = "певне знаÑеннÑ";
alert(obj[key]); // "певне знаÑеннÑ"
Object.create(null) ÑÑвоÑÑÑ Ð¿ÑÑÑий обâÑÐºÑ Ð±ÐµÐ· пÑоÑоÑÐ¸Ð¿Ñ ([[Prototype]] доÑÑвнÑÑ null):
Таким Ñином, вÑдÑÑÑÐ½Ñ Ð½Ð°ÑлÑдÑÐ²Ð°Ð½Ñ Ð³ÐµÑеÑ/ÑеÑÐµÑ Ð´Ð»Ñ __proto__. Ð¢ÐµÐ¿ÐµÑ Ð¼Ð¸ пÑаÑÑÑмо Ð·Ñ Ð·Ð²Ð¸ÑÐ°Ð¹Ð½Ð¾Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ, ÑÐ¾Ð¼Ñ Ð¿Ñиклад виÑе пÑаÑÑÑ Ð¿ÑавилÑно.
Ðи можемо називаÑи ÑÐ°ÐºÑ Ð¾Ð±âÑкÑи âпÑоÑÑимиâ або âÑиÑÑим Ñловниковимâ обâÑкÑом, ÑÐ¾Ð¼Ñ Ñо вони навÑÑÑ Ð¿ÑоÑÑÑÑе нÑж звиÑÐ°Ð¹Ð½Ñ Ð¾Ð±âÑкÑи {...}.
ÐедолÑком Ñ Ñе, Ñо ÑÐ°ÐºÑ Ð¾Ð±âÑкÑи не маÑÑÑ Ð²Ð±ÑÐ´Ð¾Ð²Ð°Ð½Ñ Ð¼ÐµÑоди Ð´Ð»Ñ ÑобоÑи з ними, напÑиклад toString:
let obj = Object.create(null);
alert(obj); // Ðомилка (вÑдÑÑÑнÑй меÑод toString)
â¦Ðле Ñе зазвиÑай ноÑмалÑно Ð´Ð»Ñ Ð°ÑоÑÑаÑÐ¸Ð²Ð½Ð¸Ñ Ð¼Ð°ÑивÑв.
ÐвеÑнÑÑÑ ÑвагÑ, Ñо бÑлÑÑÑÑÑÑ Ð¼ÐµÑодÑв повâÑзаниÑ
з обâÑкÑом Object.something(...), ÑÐ°ÐºÑ Ñк Object.keys(obj) â не ÑозмÑÑÑÑÑÑÑÑ Ð² пÑоÑоÑипÑ, ÑÐ¾Ð¼Ñ Ð²Ð¾Ð½Ð¸ бÑдÑÑÑ Ð¿ÑаÑÑваÑи з Ñакими обâÑкÑами:
let chineseDictionary = Object.create(null);
chineseDictionary.hello = "ä½ å¥½";
chineseDictionary.bye = "åè§";
alert(Object.keys(chineseDictionary)); // hello,bye
ÐÑдÑÑмки
-
Щоб ÑÑвоÑиÑи обâÑÐºÑ Ñз заданим пÑоÑоÑипом, викоÑиÑÑовÑйÑе:
- лÑÑеÑалÑний ÑинÑакÑиÑ:
{ __proto__: ... }, дозволÑÑ Ð²ÐºÐ°Ð·Ð°Ñи кÑлÑка влаÑÑивоÑÑей - або Object.create(proto[, descriptors]), дозволÑÑ Ð²ÐºÐ°Ð·Ð°Ñи деÑкÑипÑоÑи влаÑÑивоÑÑей.
Object.createзабезпеÑÑÑ Ð¿ÑоÑÑий ÑпоÑÑб повеÑÑ Ð½ÐµÐ²Ð¾Ð³Ð¾ копÑÑÐ²Ð°Ð½Ð½Ñ Ð¾Ð±âÑкÑа з ÑÑÑма деÑкÑипÑоÑами:let clone = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj)); - лÑÑеÑалÑний ÑинÑакÑиÑ:
-
СÑÑаÑÐ½Ñ Ð¼ÐµÑоди оÑÑиманнÑ/вÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿ÑоÑоÑипÑ:
- Object.getPrototypeOf(obj) â returns the
[[Prototype]]ofobj(same as__proto__getter). - Object.setPrototypeOf(obj, proto) â sets the
[[Prototype]]ofobjtoproto(same as__proto__setter).
- Object.getPrototypeOf(obj) â returns the
-
ÐÑÑиманнÑ/вÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿ÑоÑоÑÐ¸Ð¿Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð²Ð±Ñдованого
__proto__геÑÑеÑа/ÑеÑÑеÑа не ÑекомендÑÑÑÑÑÑ, ÑÐµÐ¿ÐµÑ Ñе в Annex B ÑпеÑиÑÑкаÑÑÑ. -
Ðи Ñакож ÑозглÑдали обâÑкÑи без пÑоÑоÑипÑв, ÑÑвоÑÐµÐ½Ñ Ð·Ð° допомогоÑ
Object.create(null)або{__proto__: null}.Ð¦Ñ Ð¾Ð±âÑкÑи викоÑиÑÑовÑÑÑÑÑÑ Ñк ÑÑ Ð¾Ð²Ð¸Ñа клÑÑ-знаÑÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð·Ð±ÐµÑÑÐ³Ð°Ð½Ð½Ñ Ð±ÑдÑ-ÑÐºÐ¸Ñ (можливо, ÑÑвоÑÐµÐ½Ð¸Ñ ÐºÐ¾ÑиÑÑÑваÑем) клÑÑÑв.
ÐазвиÑай обâÑкÑи ÑÑпадковÑÑÑÑ Ð²Ð±ÑÐ´Ð¾Ð²Ð°Ð½Ñ Ð¼ÐµÑоди Ñа
__proto__геÑÑеÑ/ÑеÑÑÐµÑ Ð²ÑдObject.prototype, ÑоблÑÑи вÑдповÑÐ´Ð½Ñ ÐºÐ»ÑÑÑ âзайнÑÑимиâ, Ñ Ñе поÑенÑÑйно Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ Ð¿Ð¾Ð±ÑÑÐ½Ñ ÐµÑекÑи. РпÑоÑоÑипомnullобâÑкÑи ÑпÑÐ°Ð²Ð´Ñ Ð¿Ð¾ÑожнÑ.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)