Прототипи в JavaScript
Какво е прототип?
Свойството прототип първоначално е празен обект. Можете да добавяте членове към него, както бихте направили за всеки друг обект:
В горния пример създадохме функция. Но ако извикате myObject(), тогава той просто ще върне обекта прозорец, тъй като той е дефиниран в глобалния контекст. Следователно това връща глобален обект, тъй като все още няма инициализация (повече подробности по-късно в текста на урока).
Преди да продължим, трябва да обсъдим „тайната“ връзка, която кара прототипа да работи така, както го прави.
Свойството __proto__ не трябва да се бърка с прототипа на обекта. Това са две различни свойства и те работят заедно. Важно е да разберете разликите, тъй като е много лесно да се объркате в началото. Нека да разгледаме подробно. Когато създаваме функция myObject, ние дефинираме обект от тип Function.
В действителност всичко не е толкова просто. Тук предоставяме само илюстративна част, за да демонстрираме работата на прототипната верига.
Така че дефинираме myObject като функция и й даваме един аргумент за име, но не задаваме други свойства като дължина или методи като call. Защо тогава работи следният код?
Защото, когато дефинираме myObject, се създава свойство __proto__ и му се присвоява стойността на Function.prototype (както е описано по-горе). Така че, когато осъществим достъп до myObject.length, той търси свойството length на myObject и ако то не съществува, свързва веригата през връзката __proto__, намира свойството и връща неговата стойност.
Може да се изненадате. защо дължината е 1, а не 0 (или друго число). Тъй като myObject всъщност е имплементация на Function.
Когато се създаде изпълнение на обект,свойството __proto__ започва да сочи към конструктора на прототипа, който в нашия случай е функция.
Освен това, когато създавате нов обект Function, кодът на конструктора Function отчита броя на аргументите и съответно актуализира свойството this.length. В нашия случай аргументът е 1.
Но ако създадем имплементация на myObject с новата ключова дума, __proto__ сочи към myObject.prototype, тъй като myObject е конструкторът на новата реализация.
В допълнение към методите в прототипа на функцията, като call и apply, сега имаме метода myObject getName.
По този начин можем да създадем толкова реализации на обекта, колкото са ни необходими.
Защо да използваме прототип?
Например, когато разработвате игра, трябва да покажете няколко (може би сто) обекта на екрана. Всеки обект има свои собствени свойства, като координати x и y, ширина, височина и други.
Можете да направите това:
Всички тези обекти се създават и съхраняват в паметта – с отделни реализации на необходимите методи. Този подход е много далеч от идеалния - играта ще претовари браузъра. което в крайна сметка може да доведе до замръзване.
Но можете да запазите ефективността на приложението. Всичко, което трябва да направите, е да създадете сто различни обекта с един обект-прототип.
Как да използваме прототип?
За да подобрим производителността на приложението, можем (пре)дефинираме свойството прототип на GameObject. Всеки екземпляр на GameObject ще препраща към методите в GameObject.prototype, сякаш принадлежат към него.
Сега създаваме 100 реализации на GameObject.
Имаме масив със 100 GameObjects, които споделят общ прототип и дефиниция на метода за рисуване, което спестява многопамет на приложението.
Извикването на метода draw е много просто:
Прототип - нормален обект
Прототипът е нормален обект. Ако след създаването на всички екземпляри на GameObject решим да нарисуваме кръгове вместо правоъгълници, можем просто да актуализираме метода GameObject.prototype.draw.
И сега всички предишни и бъдещи реализации на GameObject ще рисуват кръгове.
Промяна на предварително дефиниран прототип.
Сега можете да използвате този метод за всеки низ:
Но този метод има недостатък. Например, можете да използвате горния метод във вашите приложения, но нова версия на браузъра може да въведе предварително дефиниран метод за изрязване на прототипа String. Така че вашата дефиниция за подстригване ще замени предварително дефинираната! о! Можете да използвате валидиране, за да преодолеете този проблем.
Въпреки това, като цяло трябва да избягвате промяна на предварително дефинираните прототипи.
Заключение
5 последни урока от рубриката "Разни"
Как да хоствате уебсайта си? Правилно избраният добър хостинг е бъдещето на вашите сайтове
Проектът е готов, всичко е проверено на локалния OpenServer сървър и можете да прехвърлите сайта на хостинга. Но коя фирма да избера? Предлагам да обмислите хостинг на fornex.com. Страхотно място за вашия проект с перспектива за бързо развитие.
Разработка на уебсайт с онлайн платформата Wrike
Създаването на уеб сайт е трудоемък процес, който изисква добре координирано взаимодействие между клиента и изпълнителя, както и между всички членове на екипа, участващи в проекта. И онлайн платформата Wrike ще бъде от голяма помощ в това.
20 Ресурси за създаване на прототипи
Избор от десетки ресурси за създаване на макети и прототипи.
Връх10 безплатен хостинг
Малка селекция от безплатни хостинг доставчици с подробно описание.
Бърза бележка: Групово АКТУАЛИЗИРАНЕ в MySQL
Не е тайна как да внедрите масово INSERT в MySQL, но с UPDATE може да е трудно. За да не прибягвате до манипулации на събитието ON_DUPLICATE, можете да използвате специалната конструкция CASE ... WHEN ... THEN.