Прототипы нужны для того чтобы экономить память. например
я создал какой нить обьект, и хочу чтобы у него были методы. потом создал другой обьект, и хочу чтобы у него тоже были эти методы.
я могу их скопировать из первого., но если у меня 100 обьектов?
я просто создаю обьект прототип в котором будут лежать эти методы, ложу их туда, а потом создаю эти мои новые 100 обьектов, и меняю у них встроеное свойство __proto__ на мой обьект прототип.
Хотя сами обьекты еще пусты, если я попытаюсь достать из них какой-то метод, то движок сначала посмотрит в самом обьекте, и ни чего там не найдет с таким именем, потом поудет искать внутри того что лежит по ссылке
__proto__ в этом обьекте)) и вот там уже найдет..
Методы записаны в обьекте один раз, "дети" БЕРУТ методы от туда, хотя в них самих их нет)
пмять экономится!
?????
PROFIT!
Например
var cat = {} //кот пустой обьект
var prototype = { //создаем контейнер в него пичкаем разные методы и свойства, будем хранить их в нем
alala : function (){ alert("АЛАЛА!!!") }
}
cat.__proto__ = prototype //засовываем в скрытое свойство кота[B] __proto__ [/B] ссылку на обьект контейнет (называется прототип)
//кот щас выглядит так, в нем одно свойство
// cat {__proto__ : [[ссылка]] }
//теперь методы обьекта прототипа доступны и в коте, хотя физически их там нет))
cat.alala() //работает хотя в самом коте метода alala нет))
все, ты разобрался в прототипах на 80% )))
а, ну да, еще кое что, оператор ровно не КОПИРУЕТ обьект прототип В свойство __proto__ ? а просто сует туда ссылку на него. то есть если мы создадим 1000 котов и направим их свойство __proto__ на наш прототип, и изменим что нибудь в прототипе, например поменяем функцию алала, то это отобразится во всех 1000 котах соответственно)) что очень удобно) так что не только для памяти это делается а еще и для удобства)
Например по умолчанию свойство __proto__ всех функций ведет на обьект
Function.prototype
да, да, есть стандартный обьект Function, и у него есть свойство prototype, в нем лежит обьект, прототип всех функций ))
если метод вызывем у какой то функции, и он не найдется в самой функции, то движок начнет его искать по ссылке __proto__ которая ведет на
Function.prototype как я уже говорил.
если мы что-то добавим туда, то это будут уметь делать сразу все функции, по аналогии с котами)))
Function.prototype.ZZZ = function(){
alert("ZZZ!!!")
}
вот, терь все функции начнут уметь делать ZZZ по аналогии с котами )))