Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.01.2012, 20:42
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

Прототипы...
1) Это сложно или просто надо хорошо разобраться?
2)где может понадобиться на практике? (желательно самый банальный и понятный пример)
__________________
оляля, ололо
Ответить с цитированием
  #2 (permalink)  
Старый 30.01.2012, 20:43
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

1.
Сообщение от 9xakep
просто надо хорошо разобраться
2. При написании более-менее больших и сложных приложений.
Ответить с цитированием
  #3 (permalink)  
Старый 30.01.2012, 20:58
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

А пример? Или все-таки строго:более-менее больших и сложных приложений
__________________
оляля, ололо
Ответить с цитированием
  #4 (permalink)  
Старый 30.01.2012, 21:02
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Прототипы нужны для того чтобы экономить память. например
я создал какой нить обьект, и хочу чтобы у него были методы. потом создал другой обьект, и хочу чтобы у него тоже были эти методы.

я могу их скопировать из первого., но если у меня 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 по аналогии с котами )))

Последний раз редактировалось Livaanderiamarum, 30.01.2012 в 21:26.
Ответить с цитированием
  #5 (permalink)  
Старый 30.01.2012, 21:28
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

Для заметок:
1)Можно добавлять к стандартным ф-иям новые методы.
___________________
Ливаандриамарум, спасибо, теперь все вроде как понятно стало! А ZZZ прикольная штука)
Только одна неясность:
Function.prototype - это (более упрощенным языком) добавить метод ко всем ф-иям? А __proto__ - добавить скопировать вставить ссылку метода к определенному объекту, для его дальнейшего вызова?
__________________
оляля, ололо

Последний раз редактировалось 9xakep, 30.01.2012 в 21:36.
Ответить с цитированием
  #6 (permalink)  
Старый 30.01.2012, 21:35
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Вобще то , щас охуеешь, можно КО ВСЕМ видам обьектов добавлять новые методы))

Есть уже заготовленные обьекты
Array.prototype , все массивы берут методы в них) туда можно добавлять свои методы или перезаписывать существующие))
всякие pup() push() лежат именно там)


String.prototype для всех строк , системное свойство __proto__ у всех строк ведет туда
Number.prototype для всех чисел

наслаждайся))

Последний раз редактировалось Livaanderiamarum, 30.01.2012 в 21:39.
Ответить с цитированием
  #7 (permalink)  
Старый 30.01.2012, 21:41
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

То есть по сути я могу изменить все методы языка?! (большинство)
__________________
оляля, ололо
Ответить с цитированием
  #8 (permalink)  
Старый 30.01.2012, 21:45
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Сообщение от 9xakep
То есть по сути я могу изменить все методы языка?! (большинство)
да!

даже alert можешь заменить на цифру 1 например )) или на другую функцию

все свойства в js имеют флаги на чтение, запись, перезапись и.т.п. если не стоит защиты от перезаписи свойства, то можешь изменять его значение))

как посмотреть клаги ? никак)
как изменить флаги? никак)
как поставить свои флаги свойствам какого то обьекта)? никак)))

это внутредвижковые вещи к которым у нас нет доступа)), к сожалению)

по стандарту мы вообще даже свойство __proto__ то менять не должны) оно должно вообще быть скрыто от программиста)), просто создатели движков решили сделать его доступным для изменения для удобства)

кстати в следующих версиях языка обещают разрешить работу с флагами))
Ответить с цитированием
  #9 (permalink)  
Старый 30.01.2012, 21:49
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

Что такое флаги? Я смогу увидеть код какого-нибудь метода?
__________________
оляля, ололо
Ответить с цитированием
  #10 (permalink)  
Старый 30.01.2012, 21:51
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

обьекты не лежат в переменных, они лежат в памяти) в оперативе) в переменных лежат только ссылки на область в памяти)

например

var q = alert

я НЕ КОПИРОВАЛ алерт))

в переменной alert лежала ссылка на область в памяти на стандартную функцию.
я просто копировал эту ссылку))
то же самое и с обычными обьектами))

кстати можно наприме сделать так

var al = alert //забейкапили ссылку на алерт в переменную al

alert = 12

al(alert) // 12

Последний раз редактировалось Livaanderiamarum, 30.01.2012 в 21:54.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прототипы лучше классов? Livaanderiamarum Общие вопросы Javascript 60 29.12.2011 02:31
Прототипы в JS Harvey Общие вопросы Javascript 3 06.12.2011 11:00
Что такое прототипы Deniskan Общие вопросы Javascript 7 03.08.2010 16:06