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

За да създадем (или да създадем екземпляр на) обект, ще започнем от нивото на земята с най-простия метод за създаване на обект: твърдото кодиране на обектен литерал. Оттук нататък ще преминем през обсъждане на по-сложните типове инстанциране (т.е. функционално инстанциране, функционално споделено инстанциране, прототипно инстанциране и псевдокласическо инстанциране). Всеки модел на инстанциране идва със своите плюсове и минуси и това ще бъде обсъдено след описание и примери на код за всеки тип инстанциране. И накрая, ще завършим дискусията с внедряването на ES6 в псевдокласическа инстанция.

Създаване на обектен литерал

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

Обектен литерал Плюсове и минуси

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

Функционален модел за инстанциране

Функционалният модел за създаване на обекти прави точно това, което загатва заглавието му: създава екземпляр на обект чрез използването на функция. Конвенцията за именуване налага да използвате главна буква в началото на името на тази функция, така че нашата функция ще се нарича Animal за този модел на инстанциране. Функцията съдържа някакъв вид обект за съхранение, който съдържа свойства на обекти (както и методи, които по същество са ключове със стойности, които са функции). В примера по-долу същият обектен литерал е създаден на ред 47 като нашия обектен литерал (гоблин) по-горе. Нов обект се създава при всяко извикване на функцията Animal.

Плюсове и минуси на функционалното инстанциране

Едно предимство на използването на функционален модел за инстанциране за създаване на обект е фактът, че той е много четлив и лесен за разбиране, което означава, че дори хора с начинаещи познания за обекти и функции ще могат да дешифрират какво се прави, когато функцията е създадена и се обади. Освен това функционалното инстанциране ви позволява лесно да създавате множество екземпляри на един и същ обект, дори с нови аргументи. Това повишава ефективността от създаването на обектен литерал, тъй като за да създадете животински обект за ново животно, просто трябва да извикате отново функцията Animal, както се вижда по-горе в ред 48, вместо да се налага напълно да пренаписвате обектен литерал за girlKitty.

Въпреки че използването на функционален модел за инстанциране е по-ефективно от създаването на обектен литерал, кодът не може да се споделя, което означава, че методите се копират в нови обекти при всяко инстанциране.

Функционален споделен модел на инстанция

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

Плюсове и минуси на функционално споделено инстанциране

Тъй като методите се съхраняват извън функцията в горния пример на animalMethods (редове 60–75), ефективността се увеличава в сравнение с функционалното инстанциране, тъй като методите са в независим, повторно използваем обект, който не е създаден заедно с нов екземпляр на обект. Въпреки това, ако методите са модифицирани в дадена точка, това може да доведе до податливост на грешки при този метод на инстанциране.

Прототипен модел на инстанция

Моделът за създаване на прототип за създаване на обект използва Object.create(), за да създаде нов обект, позволявайки му достъп до прототипната верига, като по този начин позволява на нови екземпляри на обекта да имат достъп до методите на обекта при всяко извикване на функцията. По време на създаването на метода (редове 91–104) се използва свойството прототип на животното. Освен това, вместо да се налага да извиквате animalObj от обекта, ключовата дума this може да се използва във функциите, използвани за създаване на методите на мястото на animalObj. Този модел за инстанциране е най-ефективният и най-малко склонен към грешки от моделите за създаване на обекти, които обсъдихме.

Псевдокласически модел на инстанциране

Псевдокласическият модел за инстанциране за създаване на обект е дори по-ефективен модел за инстанциране на обект от прототипния модел, тъй като има по-малко редове код. Във функцията Animal вече не се нуждаем от редовете, съдържащи Object.create() или израза return; тези твърдения се подразбират в псевдокласическия модел, поради внедряването на ключовата дума new в ред 131, когато функцията Animal. Тъй като animalObj не присъства във функцията Animal, ние разчитаме на ключовата дума this за създаването на всяко свойство на обект, както и при създаването на метод.

Използване на ES6 за псевдокласически модели за инстанциране

Има някои промени в псевдокласическия модел на инстанциране, когато се внедри синтаксисът на ES6. Първо, ключовата дума class се използва на ред 138. Освен това ключовата дума constructor се използва на ред 139 за създаване на функция конструктор. При внедряването на методи използването на свойството прототип вече не е необходимо, тъй като сега работим в обхвата на класа. Имайте предвид, че новата ключова дума все още се използва в ред 162.

Заключение

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