По-отблизо към по-малко известните части на JavaScript

Зи чудили ли сте се някога какво се случва, когато се опитате да присвоите стойности на свойствата на обекта нещо като myObject.name = someValue

ако мислите, че това е просто нормално задание или сте на същата страница, където бях аз, когато започвах с JavaScript, тогава ми позволете да напиша функция за вас, която се надяваме да изчисти съмненията ви.

const amIThinkingRight = () => {
    return
        'Hurraaaahhhh!!!! you are thinking 100% right'
    }

така че, както може би се досещате (ако не 🤓 опитайте да стартирате отново нашата магическа функция) не всичко е розово, трябва да се потопим по-дълбоко, за да разберем тази концепция.

нека ви кажа веднага, че задаването на свойства на обект е по-нюансирано от просто добавяне на ново свойство към обекта или промяна на стойността на съществуващо свойство.

нека да разгледаме операцията по-долу, където се опитваме да присвоим нова стойност на свойството name на myObject.

myObject.name = "someValue"

нека покрием всички случаи/сценарии един по един

  1. Ако myObjectвечеима нормално свойство за достъп до данни, наречено nameдиректно присъства в него, присвояването е толкова просто, колкото промяна на стойността на съществуващото свойство.
  2. Ако име не присъства директно в myObject, веригата [[прототип]] се преминава. Ако name не се намери никъде във веригата, свойството name се добавя директно към myObject с указаната стойност.

Но изненадващото (може би сложно) поведение може да възникне, когато nameвече присъства някъде по-високо във веригата [[прототип]].

Нека да разгледаме тези сценарии сега

  1. Ако нормално свойство на инструмента за достъп до данни име се намери някъде по-високо във веригата [[прототип]] и е записваемо, тогава ново свойство nameсе добавя директно към myObject и това се нарича shadowing.
  2. Ако нормално свойство за достъп до данни name се намери някъде по-високо във веригата [[prototype]] и то е само за четене (writable:false ), тогава актуализирането на съществуващо свойство във веригата [[prototype]] или създаването на ново свойство директно върху myObjectса забранени.
  3. Ако име се намери някъде по-високо във веригата [[прототип]] и то е Setter, тогава Setter винаги ще се извиква, в този случай няма да има засенчване.

Така че ако приемем, че присвояването на свойство винаги ще води до засенчване,ако свойството вече съществува по-високо във веригата [[прототип]] не е 100% вярно, както можете да видите вярно е само в първия случай.

БОНУС 😎

Ако не можете да разберете защо нашата магическа функция amIThinkingRightвърна недефинирановместо „Урааааххх !!!! вие мислите 100% правилно” низ, тогава ми позволете да дръпна завесата вместо вас.
Причината за това е свързана с факта, че точката и запетая не са технически незадължителни в JavaScript. В резултат на това, когато редът, съдържащ израза return (без нищо друго в реда), се срещне в amIThinkingRightмагическа функция, точка и запетая се вмъква автоматично веднага след оператора return .