ПредишенСледващото

Прототипът на ООП

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

В реалния свят, ако искате да създадете един стол, щеше първо да създадете дизайн на хартия и след това произвежда столове, въз основа на този проект. Проектът тук - клас, а столовете са обекти. Ако искате да направите люлеещ се стол, вие ще вземете един проект, направихме някои промени и ще създаде люлеещ се стол.

Object.create (нула) създава нов празен обект. След това, ние добавяме функции и функции на новия ни проект:

genericAnimal - обект, и по този начин може да се използва:

Ние току-що създадената котка като клонинг на обичайната животното. Можем да добавим, за да го характеристиките и функции:

Можем също така да използвате нашата котка като прототип и изграждане на още няколко котка:

Нова дума и функция конструктор

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

Разбирането на делегация и изпълнение на прототипи

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

Някои примери от предишния код може да илюстрират този момент:

Следващият ред създава нов празен обект с нулева __proto__:

Следващият ред създава празен обект с __proto__. което показва, гризач:

Както можете да видите, като всеки обект съдържа позоваване на неговия прототип. Да разгледаме функцията Object.create. Изглежда, че функцията на "клонинги" родител обект, както и свойствата на родител се копират на дете елемент, но това не е така. Когато капибара е създаден от гризач. капибара - това е празен обект по отношение на гризача.

Но след това, ако ние capybara.size обадя веднага след създаването си, ние получаваме S размер, който е разположен в обекта родител. Каква магия е това? След капибара все още не разполага с размера на имота. Въпреки това, когато пишем capybara.size. ние по някакъв начин да получите размера на прототип имота.

Настройване на свойствата на малко по-различно. Когато ние се capybara.size = 'XXL ". Новият размер на собственост. капибара е създаден в обекта. И следващия път, когато се опита за достъп до capybara.size. ние ще го намерите директно в обекта, за да стойност "XXL".

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

Създаване Object.create

Object.create в действие

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

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

Обектно-ориентиран на базата на класа, в сравнение с прототипа на ООП

И двата подхода имат своите плюсове и минуси. Но прототип на базата на ООП по-лесно да се разбере, че е по-гъвкав и динамичен.

За да получите представа за динамичната си природа, да разгледаме следния пример: пишете код, който използва функцията indexOf в масиви. След неговото писане и тестване в добро браузъра, който са склонни да го проверите в Internet Explorer 8. Както се очакваше, ще се сблъскате с проблеми. Тъй като функцията indexOf не е дефинирано в IE8.

И така, какво да правя? В обектно-ориентиран, основан на класови, можете да се реши този проблем чрез дефиниране на функция в друга класа "асистент", която се масив или списък като вход, и замества всички разговори в кода си. Или може да бъде разделена Списък или ArrayList на подкласове, дефинира функция в подклас и използвате нов подклас вместо ArrayList.

PLO подражават клас-базирани, че може да се обърка

Да разгледаме следния пример, написана с псевдо-класовете:

Този модел на наследството. Въпреки това, нещо смешно става тук - ако проверите colonel.offspring и puff.offspring. ще забележите, че всеки един от тях съдържа две еднакви потомство!

Тъй като тя изглежда като обикновен клас на базата на обектно-ориентиран, можем да използваме това, за да се изгради една йерархия наследство, както е показано в следния пример:

Всичко изглежда добре, докато не мисля, че ООП клас. Но ако се опитате table.events [ 'кликнете .expand'] в конзолата, ще видите "разгъване"! Както и да е, ние имаме HideableTableView манипулатор разширите събитие. въпреки че той не е определен в този клас.

Вижте проблема в действие тук.

Горният проблем възниква по същата причина, както е описано в предишния пример. В Backbone.js да работят, като се опитва да го направи да изглежда като класовете, за да видите прототип верига, се крие във фонов режим. След като се разбере как е структурирана по веригата на прототип, можете да намерите лесно решение на този проблем.

заключение

Свързани статии

Подкрепете проекта - споделете линка, благодаря!