Разуменне аператара выдалення на Object.create () у літаральным аб'екце

Гэты пост - гэта дакументацыя, на якую я разумею, як аператар выдалення працуе на аб'екты, створаныя пры дапамозе Object.create () супраць аб'ектаў, створаных пры дапамозе аб'ектнага літаралу.

Адмова ад адказнасці - ні ў якім разе не сцвярджаю, што наступнае з'яўляецца адзінай крыніцай ісціны. Не саромейцеся дадаць выпраўленні і дадатковую інфармацыю ў раздзел каментарыяў, калі вы лічыце, што змест недакладны або недастатковы.

Першы выпадак - з дапамогай Object.create ()

Прыклад, каб зразумець, як Object.create () працуе пад капотам -

Object.create () вяртае новую спасылку на аб'ект, створаную з прататыпа, перададзенага ў якасці параметра ў функцыю стварэння. Іншымі словамі, прата-аб'ект далучаецца да __proto__ ва ўласнасці новастворанага аб'екта (objA).

Паспрабуем разабрацца ў вышэйзгаданым выказванні ў наступным раздзеле.

Адкрыйце храмаваную кансоль DevTools і ўвядзіце objA. Калі вы разгарніце яго, вы павінны ўбачыць нешта падобнае да наступнага

Здымак экрана DevTools з objA

Прататып ланцужка тлумачыцца лагічна з выкарыстаннем дыяграмы

var proto = {
foo: 'foo'
};
var objA = Object.create (proto);
var objB = objA;

Мы ствараем прата аб'ект і перадаем яго ў якасці аргумента функцыі Object.create (). Функцыя вяртае новую спасылку на аб'ект, якая прызначаецца зменным objA і objB.

Гэтая новая спасылка на аб'ект дадаецца ў ланцужок прататыпа.

Паток пасля стварэння новага аб'екта
objB.foo = 'бар';

калі сустракаецца гэты радок, у яго ўтрымліваемым аб'екце (objB) ствараецца новае ўласцівасць Foo.

Паток пасля стварэння новай уласцівасці ў objA & objB
выдаліць objB.foo;
Аператар выдалення можа дзейнічаць толькі на ўласцівасці аб'екта, які змяшчае яго.

таму ў нашым выпадку, калі сустракаецца выдаленне objB.foo, уласцівасць foo, які змяшчае аб'ект (objB), выдаляецца, але ўласцівасць foo гэтага аб'екта proto застаецца ў ланцужку прататыпа.

Паток пасля аперацыі выдалення
console.log (objA.foo); // Фу

Калі мы робім console.log (objA.foo), ён шукае ўласцівасць foo ў сваім аб'екце (objA).

Калі ён не можа знайсці ўласцівасць, ён выглядае ўнутры аб'екта, які змяшчаецца ў яго ўласцівасці __proto__.

У нашым выпадку ён знаходзіць foo ўласцівасць у аб'екце proto і друкуе значэнне foo

Справа другая - з выкарыстаннем аб'екта літарал

Літарал аб'екта будзе мець уласцівасць __proto__, якая спасылаецца на прататып аб'екта ў ланцужку прататыпа, як толькі ён будзе створаны.

Адкрыйце кансоль Chrome DevTools і ўвядзіце objB. Калі вы разгарніце яго, вы павінны ўбачыць нешта падобнае да наступнага

ланцужок прататыпа, як паказана на кансолі DevTool
var proto = {
foo: 'foo'
};
var objA = proto;
var objB = objA;

мы ствараем прата аб'ект і прысвойваем яго objA, які ў сваю чаргу прызначаецца objB. Такім чынам, усе тры зменныя паказваюць на адно і тое ж аб'ектнае ўказанне.

У выпадку літаральнага аб'екта, ланцужок прататыпа будзе выглядаць прыблізна наступным -

Паток пасля стварэння новага аб'екта

Калі ствараецца літаральны аб'ект, ён прымацоўваецца да прататыпа ланцужка, а ягоны непасрэдны бацькоўскі ланцужок у прататыпе.

objB.foo = 'бар';

Паколькі ўсе тры зменныя паказваюць на тую ж спасылку на аб'ект, мадыфікацыя Foo будзе пакідаць падобны паток

Паток пасля абнаўлення ўласцівасці
выдаліць objB.foo;

Пры выдаленні objB.foo сустракаецца ўласцівасць аб'екта (objB), які выдаляецца, і пакідае пусты аб'ект.

Паток пасля аперацыі выдалення на objB
console.log (objA.foo); // Невызначаны

Калі мы робім console.log (objA.foo), ён шукае ўласцівасць у яго аб'екце (objA).

Калі ён не можа знайсці ўласцівасць, ён спускаецца па ланцугу да непасрэднага аб'екта, які змяшчаецца ва ўласнасці __proto__, і шукае спасылку на імя ўласцівасці.

У нашым выпадку, паколькі аконны аб'ект з'яўляецца непасрэдным аб'ектам у ланцужку прататыпа, ён шукае ўласцівасць Foo ў аб'екце акна.

Відавочна, што выснова не вызначаны, бо ўласцівасць Foo адсутнічае ў ланцужку прататыпа.

Рэзюмэ

  • Object.create (proto [, propertiesObject]) вяртае новы пусты аб'ект, яго ўласцівасць __proto__ паказвае на аб'ект proto.
  • Прысваенне літаральнага аб'екта іншай пераменнай аб'екта прывядзе да абодвух накіраваных на тую ж спасылку на аб'ект.
  • delete выдаляе толькі ўласцівасць, на якое спасылаецца аб'ект, які змяшчае.

Вялікі дзякуй за выдаткаванне вашага каштоўнага часу на чытанне гэтага паведамлення. :)

Літаратура