Прототипы...
1) Это сложно или просто надо хорошо разобраться?
2)где может понадобиться на практике? (желательно самый банальный и понятный пример) :thanks: |
1.
Цитата:
|
А пример? Или все-таки строго:более-менее больших и сложных приложений :)
|
Прототипы нужны для того чтобы экономить память. например
я создал какой нить обьект, и хочу чтобы у него были методы. потом создал другой обьект, и хочу чтобы у него тоже были эти методы. я могу их скопировать из первого., но если у меня 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 по аналогии с котами ))) |
Для заметок:
1)Можно добавлять к стандартным ф-иям новые методы. ___________________ Ливаандриамарум, спасибо, теперь все вроде как понятно стало! :) А ZZZ прикольная штука) Только одна неясность: Function.prototype - это (более упрощенным языком) добавить метод ко всем ф-иям? А __proto__ - |
Вобще то , щас охуеешь, можно КО ВСЕМ видам обьектов добавлять новые методы))
Есть уже заготовленные обьекты Array.prototype , все массивы берут методы в них) туда можно добавлять свои методы или перезаписывать существующие)) всякие pup() push() лежат именно там) String.prototype для всех строк , системное свойство __proto__ у всех строк ведет туда Number.prototype для всех чисел наслаждайся)) |
То есть по сути я могу изменить все методы языка?! (большинство)
|
Цитата:
даже alert можешь заменить на цифру 1 например )) или на другую функцию все свойства в js имеют флаги на чтение, запись, перезапись и.т.п. если не стоит защиты от перезаписи свойства, то можешь изменять его значение)) как посмотреть клаги ? никак) как изменить флаги? никак) как поставить свои флаги свойствам какого то обьекта)? никак))) это внутредвижковые вещи к которым у нас нет доступа)), к сожалению) по стандарту мы вообще даже свойство __proto__ то менять не должны) оно должно вообще быть скрыто от программиста)), просто создатели движков решили сделать его доступным для изменения для удобства) кстати в следующих версиях языка обещают разрешить работу с флагами)) |
Что такое флаги? Я смогу увидеть код какого-нибудь метода?
|
обьекты не лежат в переменных, они лежат в памяти) в оперативе) в переменных лежат только ссылки на область в памяти)
например var q = alert я НЕ КОПИРОВАЛ алерт)) в переменной alert лежала ссылка на область в памяти на стандартную функцию. я просто копировал эту ссылку)) то же самое и с обычными обьектами)) кстати можно наприме сделать так var al = alert //забейкапили ссылку на алерт в переменную al alert = 12 al(alert) // 12 |
Цитата:
код родного метода будет выглядить так 100100101010101011100101 ты же не думаешь что они сделаны на джаваскрипте? они сделаны на с++ и скомпилированы в двоичный код. |
<script> var al = alert; alert = function () {} alert('nya') al('nya1') </script> "даже alert можешь заменить на цифру 1 например" Позоришься) Не может название начинаться с цифры) <script> var 1 = alert; alert = function () {} alert('nya') 1('nya1') </script> |
![]() |
Стыдно стало :haha:
Вот попробовал написать такую штуку: Имеем ф-ию конструктор - создает имя Имееи ф-ию конструктор - создает фамилию Создаем 1ый объект - пишем имя Создаем 2ой объект - пишем фамилию Копируем имя из 1ого объекта ко 2ому, в результате чего имеем объект с именем и фамилией function setName(name) { this.name = name; } var person1 = new setName('Миша') function setFam(fam) { this.fam = fam; } var person2 = new setFam('скрепников') /*----- Как выглядят наши человеки: person1 = { name: 'Миша' }, person2 = { fam = 'скрипников' } -------*/ person2.__proto__.name = person1.name alert(person2.name + ' ' + person2.fam) Я не где не ошибся? |
И вправду, каждый школьник знает что называть переменные с цифры нельзя), как то я не подумал. Запомни это правило наизусть)! И не повторяй моих ошибок!
![]() |
Я то не повторю, я вроде не настолько тороплюсь в работе, чтобы делать дебильные ошибки, хотя... :write:
|
window[1] = alert alert = "школота нубота" this[1](alert) |
хитропопый, ливаандриамарум, ты же так и не назвал переменную\фф-ию итд цифрой
|
Цитата:
это как Астерикса(депардье) называли астериксм, и.т.д.)) |
9xakep,
это же невозможно! О_О ты же сам писал! |
Ну значит ошибался)
|
Почему ошибался? Ну ты совсем нелогичный какой-то, ты определись либо возможно либо нет)!
|
Твой логин можно выговорить. Определился
|
Часовой пояс GMT +3, время: 11:37. |