Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > JavaScript: Общие вопросы > Обсуждение темы о "прототипах" |
Автор: Sardar 30.4.2005, 23:42 |
Здесь можно выражать спасибы, а также спрашивать что не ясно. Делать заявки на другие темы и аспекты JS. Впрочем я сам буду постепенно выкладывать "подноготную" ![]() |
Автор: Aliance 1.5.2005, 20:27 |
Браво ![]() ![]() |
Автор: Aliance 22.5.2005, 20:05 | ||
Объясни, зачем вот это:
в первом посте... Оно ж ничего не делает... |
Автор: Sardar 22.5.2005, 20:52 |
Это пример, что функция это обьект, как любая другая переменная. Это трудно усвоить например людям пришедшим из C. Неужели кто то решил таки прочесть сие ![]() Какюсь, ещё не дописал, даже примеров из жизни не привёл, всё потом... ![]() |
Автор: Aliance 22.5.2005, 21:12 | ||
Ясно-понятно. Я это хорошо понимаю, значит пропускаем ![]() Во втором посте в самом первом коде, почему вот это
выдает 2, а не 0? да я в первый же день прочитал ее, очень хорошая статья. вот теперь осмысливаю, разбираюсь.. |
Автор: Sardar 22.5.2005, 22:05 | ||
Потому что при вызове функции, не важно как конструктор или как просто функция, создаётся вложенная функция, ссылка на которую присваивается переменной а. Вложенная функция наследует контекст, в котором определенна переменная parg, содержащая ссылку на список аргументов "родительской функции". Другими словами новая функция содержит "вызов" родительской функции и имеет список всех переменных доступных из контекста в момент вызова. При каждом новом вызове "родительской функции" создаётся новая функция, записываемая в а, при вызове функция показывет сколько аргументов было у родителя в момент его вызова. Попробуй написать пару тестов, сразу поймёшь суть ![]() |
Автор: Aliance 22.5.2005, 22:10 |
Sardar![]() Все время кажется, что нельзя прочитать те значения, которые объявлены после их чтения... Понятно, теперь. Добавлено @ 22:18 Вау, я понял http://forum.vingrad.ru/index.php?showtopic=50738&view=findpost&p=396839 полностью. Я понял что мне было не понятно - функция test - конструктор. Если мы пишем this - мы создаем новое свойство у объекта... а если var - то переменную ![]() Теперь собственно буду ждать инфы о собственно-прототипах, спасибо Сардару ![]() |
Автор: Иль 28.5.2005, 18:18 | ||
Выражаю свои СПАСИБЫ. Sardar, спасибо что потрудился и потратил время, хорошо цементирует ![]() |
Автор: Иль 2.6.2005, 20:28 |
Я не ошибаюсь, что в рекурсии каждый раз создаются новые объекты function? |
Автор: Sardar 3.6.2005, 00:44 | ||
Иль, ты всё правильно понял потому функция и держит "контекст вызова внешней функции" ![]() Другое дело что в конкретной имплементации не обязательно создаёться куча скомпилированного скриптового кода в памяти, контекст передаёться единой функции, что экономит память и работает быстрее. |
Автор: Иль 3.6.2005, 10:57 | ||
Sardar, я недопонимаю. Получается что на практике реализация этого объектного подхода в рекурсии или вложенном вызове самой себя через другие функции не работает? Вот смотри, есть функция.caller и есть arguments.callee. Они ж дают ссылки на соответствующие объекты, тогда ж почему в операторе if сравниваются их строковое представление?
Добавлено @ 11:02 Или это из-за специфики работы оператора if |
Автор: Aliance 16.6.2005, 13:12 |
ppc. Я наконец-то понл примененеие протопипа в большинстве случаев. Ура, товарищи. Все таки я прочел проф. книгу - понимаю, что до этого нужно "дорости" самостоятельно =) Вот непонятой осталась одна область: Зачем протопипы сущ-ют для функции? |
Автор: Sardar 17.6.2005, 02:53 | ||
Иль, нет не их строковое преставление сравниваеться, сравниваються ссылки, если обе переменные ссылаються на один обьект функцию, то они идеентичны. Другое дело что caller вещь весьма магическая, не рекомендуемая к употреблению ![]() ![]() P.S. ивиняюсь что так поздно отвечаю, потестил, получил результаты что не смог обьяснить, а навязывать свою точку зрения не хотел =)
В смысле зачем? Функция это тоже обьект, следовательно имеет конструктор(Function), следовательно и прототип(Function.prototype). Будешь ли ты это использовать, третий вопрос, но в языке не должно быть исключений если это не необходимо ![]() P.S. В Опере 6 обьект Function не существует. В IE обьект event, window и другие DOM0 обьекты не имеют поля constructor. Это конечно верно, это всё синглтоны, но вносит исключения, что не есть гуд. |
Автор: Aliance 17.6.2005, 12:02 | ||
Так и знал, что ответ будет таким. Я это прекрасно знаю. меня именно интересует применение ![]() |
Автор: Sardar 18.6.2005, 01:04 | ||||
Ну я по натуре человек предсказуемый ![]() А применяться это может например чтобы IE5.0 пофиксить, он не поддерживает методов call и apply у функций.
Аналогично пишеться apply. |
Автор: Aliance 18.6.2005, 18:06 |
Вот, оно. Лови в репу ![]() |
Автор: o.s.a. 30.7.2005, 10:11 |
Извините, а скоро будет продолжение? А то очень интересно. ![]() |
Автор: Гость_12345 17.10.2005, 00:59 |
ЦеННо, но заметил баги в языке интерфейса. Не все слова пишутся с 2 "н". Список замеченных опечаток ниже : ; ) ссылка: http://forum.vingrad.ru/index.php?showtopic=50738 изложенно -> изложено записанны -> записаны вызванна -> вызвана созданна -> создана (3 раза) показанно -> показано |
Автор: Sardar 17.10.2005, 01:53 |
Гость_12345 спасибо, исправил. |
Автор: Greendrake 22.1.2006, 21:52 | ||
Откопал обалденную презентацию по сабжу, рекомендую её также всем кому интересна обсуждаемая статья http://sbnt.jinr.ru/iris/articles/javascript-titov.ppt По теме: объясните мне плиз вот энтот объектно-прототипный синтаксис, который использовал Котеров в своём JSHttpRequest (привожу "каркас" его кода):
Как-то очень всё хитро. Сначала задаётся название головного объекта - JSHttpRequest, после него - () - типа это функция, затем - {} - типа это объект. А затем всё остальное помещается в скобки ( ..... ), внутри которых (разве так можно??) определён прототип всей этой бандуры. А после них на конце ещё (); Круто блин, тоже так хочу уметь ![]() |
Автор: Greendrake 23.1.2006, 23:55 |
Zeroglif, спасибо, вроде прояснилось. Не понял, зачем могло понадобиться определять метод dataReady сначала напрямую - JSHttpRequest.dataReady, а потом другим способом - внутри прототипа, с нижним подчёркиванием в начале (кстати что оно означает, для чего служит, и что если без него?): _dataReady: function(text, js) {} Как я понял, переопределяем методы через прототип для того, чтобы потом можно было создавать экземпляры JSHttpRequest, верно? Т.к. если определить просто по типу JSHttpRequest.dataReady, то этот метод присобачится именно к этому конкретному JSHttpRequest, а к его клонам - уже нет? |
Автор: Sardar 24.1.2006, 00:56 |
Идея была в том что бы скрыть некоторые локальные переменные "класса", как бы сделать их приватными. Также обойти в ИЕ утечку памяти при использовании closures, хотя именно в примере её не будет, но это не весь код. JSHttpRequest.dataReady это поле функции (closure) JSHttpRequest, а _dataReady это поле обьектов порождённых от JSHttpRequest, т.е. совершенно разные вещи ![]() |
Автор: Иль 24.1.2006, 11:49 | ||
Там говорится про перегрузку методов - нет её в JavaScript. Там не перегрузка а переопределение методов |
Автор: regis 20.2.2006, 15:10 |
Sardar, спасибо большое! Попробую разобраться с JS на досуге... |
Автор: dm9 19.3.2006, 22:30 |
Я прочитал - всё понятно, большое спасибо. Правда, я читаю это после котеровских набл, так что пошло достаточно легко ![]() Например, call(), apply(), arguments, .caller, .callee. О таких вещах узнаёшь как-то случайно, из статей, из обсуждений - сами авторы считают их вещью всем известной и очевидной. Котеров, например, пишет про основы Ява-Скрипта, и считает, что читатель знаком с apply и call. Странно это... (Не наезд, всем авторам в любом случае большое спасибо - это так, пожелание). |
Автор: Ciber SLasH 19.3.2006, 23:44 |
[offtop] dm9, а ты качни справочник по JS в моей подписи, и будешь знать какие методы есть у тех или иных объектах (в догонку ещё и WDH не мешало бы скачать). ![]() [/offtop] |
Автор: Sardar 20.3.2006, 01:19 | ||
Сразу забудь тогда про IE5.0- , этот зверь не поддерживает ничего из JS, по сути это почти VBS с изменённым синтаксисом, такой же уровень гибкости. .caller трогать нельзя, теоретической основы под этим не помню, но в JS1.5 (все современные браузеры) он deprecated arguments это весьма логичный способ подойти к аргументам функции, у которой их может быть сколько угодно. Также для простоты забросили туда и остальную инфу типа callee. Жаль что это обьект, а не Array, не хватает многих функций (map, filter и т.д.), которые сами вешаем (камень в огород ECMA) на прототип Array. call и apply выполняют одно и тоже - вызывают функцию в контексте обьекта, только способ передачи аргументов разный. Что бы это понять и грамотно заюзать, потребуеться серьёзно упроситься от классического ООП. Развёртка аргументов круче в Python, хватило бы тогда и одной call функции. В Fortress лучше сделан реверанс в сторону фанатов ООП, которые не всегда понимают "этот метод может быть методом любого обьекта и изменяться динамически". Множества "операций" traits по моему очень красиво и эффективно. По поводу использования, обычно народ решает задачи "привычными" методами, мне например проще так:
Вместо удержания моря глобальных массивов (регистров) или собирать "классы". Как видно, даже самая простая задача не обходиться без расширения интерфейса стандартных обьектов, в частности массива... и очень не хватает человеческого списка, хештаблицы, карты(любой обьект, любой обьект) и многих других вещей. Порой думаю что за это растрелял бы парней ECMA... ![]() P.S. глянул на пост, больше критики на JS чем ожидал... ![]() |
Автор: dm9 20.3.2006, 03:11 | ||
В примере разобрался, спасибо! Вот это, конечно, для меня странно ![]() function colorFade() colorFade.handles={}; colorFade.resolution = 50; То есть код я понимаю, но я бы стал "собирать класс"... Интересное применение. Буду осознавать ![]()
Скажи, а не существует таких библиотек, которые это всё реализуют? Наверняка кто-то пытался собрать этакий STL для JS. |
Автор: Ciber SLasH 20.3.2006, 03:13 |
Sardar, я снимаю перед тобой шляпу.![]() Мне бы так научиться жонглировать в скриптах. Я посмотрел код, разобрался, понял реализацию, но до меня не доходит сам алгоритм работы colorFade-а. Не мог бы ты описать сам алгоритм? |
Автор: dm9 20.3.2006, 03:42 | ||
Давай я попробую ![]()
|
Автор: Ciber SLasH 20.3.2006, 05:54 |
dm9, спасибо за разжовывание. В принципе меня интересовал только сам механизм смены цветов. ![]() |
Автор: Sardar 20.3.2006, 11:35 | ||||
colorFade.handles={}; - в JS нет человеческой карты обьект=>обьект, потому пользуемся обьектом как хештаблицей. Сохраняем таймеры в общем регистре, что бы потом можно было остановить если человек нескольк раз нажмёт на кнопку. colorFade.resolution = 50; - это конфигурационная переменная, одна на все fade. Да можно было сделать некий класс, возможно даже singleton, но в JS мне так проще. В PHP5 или в Java уже классами.
Не совсем, это идентификатор для карты handles, где храним таймеры. Но карт в JS нет, это обьект, а обьект имеет стандартный интерфейс. Таким образом ключь toString и прочие будут перезаписывать совсем не то что ты хотел. В итоге лучше "обезоапсить" добавив тильду, т.к. ни одно поле у обьекта с тильды не начинаеться. Не красивый, но рабочий хак... ![]()
Угу, пример накатал за 15 минут для поста, ночью, была заморочка с "дёрганьем цветов" если от c colorfrom, разбираться не хотел и попросту схалтурил ![]() Отсюда можно вывести два понятия что люди часто путают: выразительность и читабельность языка. Выразительность это то, на сколько просто языком описать свою мысль/идею, либо это пара строк кода, либо 100кб в куче файлов. Читабельность это простота восприятия синтаксиса, не каждый новичёк считает тернарный оператор ?: хорошо читаемым, в то же время он очень выразителен. Самые читабельные по моему паскалеподобные языки, самые выразительные функциональные и ООП (Java и C#, a C++ пусть идёт лесом). Чем выше уровень программиста, тем больше потребность именно в выразительности. ИМХО JS'у не хватает выразительности, это красивый и мощный язык, но имплементируя его я бы пошёл дальше ECMA. Если откинуть прямую "обьектность" то легко можно распараллелить исполнение (хотя это будет уже не JS...), натолкнуло http://lisp2d.crimeastar.net/ Ciber SLasH, ничего в алгоритме нету ![]() |
Автор: dm9 20.3.2006, 12:23 | ||
А всё-таки... немного оффтоп, конечно, но тут вся тема - оффтоп ![]()
Интересны не отдельные разработки "по мелочам", а именно попытка собрать всё в один пакет. |
Автор: Sardar 20.3.2006, 12:52 | ||
Лишний вес по сути Посмотри что я писал для этой шкурки форума, MyLib.js, там доведение до ума интерфейса Array, addEventListener и прочее. Только то что использовал, то и осталось. Видел либы для анимаций и эфефктов, дахзе сам писал, но как то в реальной жизни не требуеться. Да и написать это всё по новой просто, скрипты ведь. Угу, думал как это всё аккуратно вырезать в отдельную тему, от работы в мыслях хаос, почищю топ позже ![]() |
Автор: elferno 31.8.2007, 15:53 |
я похоже слишком примитивный чтобы понять концеп прототипного JS, Вы не могли бы, пожалуйсто, ответить: 1. зачем вообще применять такую модель. 2. если я все пишу примитивным способом: document.getElementById("my_element").innerHTML='123'; вместо inner='123'; document.getElementById("my_element").appendChild(inner); //вроде как-то так то каким образом мне сейчас лучше поступить? заранее спасибо. P.S. был бы весьма признателен получив Ваш ответ в ICQ на номер 282-897-997 |
Автор: cruelangel 12.9.2007, 22:43 |
>во многих языках есть понятие полей обьекта, при изменении которого вызывается функция обработчик(т.н. get/set функции). их правильнее называть свойствами, а поля - это просто хранилище данных безо всяких геттеров и сеттеров |