|
Модераторы: Sardar |
|
Sardar |
|
||||||||||||
Бегун Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: нет Всего: 317 |
Одной из основных и, зачастую, "трудно воспринимаемых фишек" библиотеки prototype.js является поддержка "классов". Рассмотрим код:
Как это использовать думаю сразу стало ясно. Рассмотрим, что же происходит в деталях. Class является простым литеральным объектом, все литеральные объекты - это Object. У этого объекта определено поле create, в которое положили функцию, задача которой создать closure, который в свою очередь вызывает функцию initialize на объекте, являющимся текущим контекстом вызова. (* далее по тексту функции и замыкания (closure, анонимные функции) будут разделяться по смыслу, хотя в JavaScript фактически разницы между ними нет - вернее, привычных всем функций нет. *) Не думаю, что всё стало ясно, потому разберём по шагам . Class.create() создаёт анонимную функцию:
Класс Test на самом деле не является идентификатором типа, это просто переменная, хранящая в себе анонимную функцию:
Впрочем, от этого ни холодно, ни жарко - типов в JS нет, следовательно, в "приведении к типу" нет необходимости, следовательно, не нужны свои идентификаторы типов. Class.create() при каждом вызове возвращает новую анонимную функцию со своим чистым, как слеза, прототипом. Этот прототип можно расширить привычным Test.prototype.fieldName = ... или полностью заменить новым объектом, как это мы сделали раньше. В обоих случая необходимо определение поля initialize, вызываемое конструктором; в нём происходит инициализация объекта. Таким образом, получаем приятный глазу способ "определения класса".
Минусы подхода с заменой прототипа новым объектом в том, что поле constructor новых объектов, порождённых от "класса", будут указывать не на "класс", а на конструктор объекта, используемого как прототип. Все литеральные объекты (определяются { }) порождаются конструктором Object, следовательно:
Поле constructor у объекта позволяет создать ещё один такой же объект, не зная имени функции конструктора, хотя на практике это практически никогда не используеться. Итак, вернёмся к самому первому листингу и на словах опишем выполнение кода:
Этот подход позволяет объявить "приватные поля класса", не видимые никем, кроме функций определённых в конструкторе. Не буду убеждать, что приватные поля чужды гибкому JS, но всё же, если они вам понадобятся, то определяйте их и методы, которые их пользуют, в конструкторе класса, т.е. в initialize. Вопрос: нужна ли нам эта поддержка в ViJio? Если нужна, то необходимо выработать стиль написания кода, который позволял безболезненно соединять код написанный методом выше или по старинке определяя конструктор и прототип "самому". Физически разницы почти нет, есть только различия в синтаксисе. Это сообщение отредактировал(а) Sardar - 31.7.2006, 15:15 -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||||||||||
|
|||||||||||||
Sardar |
|
||||||||
Бегун Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: нет Всего: 317 |
Теперь подумаем о наследовании.
В языках с "жёсткими типами", таких как Java/C#, многие привыкли видеть некий базовый класс, описывающий основную функциональность, а детали оставляющий на потомков. Либо просто новый класс, расширяющий функциональность уже существующего класса. В любом, случае сохранется:
Не будем углубляться в метапрограммирование и конецепцию traits, просто представим, что можно импортировать некий метод или функцию в класс, тем самым расширив функционал объекта. При этом никаких связей и отношений is a к другим классам, из которых импортируем функционал, не определяются, мы просто даём некоторому объекту пользоваться функцией/методом. Из этого следует:
Как видим, удобно иметь одну функцию для передвижения объектов по экрану (drag&drop например), независимо от того, что это: таблица, слой или слово из текста. Главное, это возможность придать объектам новые способности временно по задаче, а не жёстко кодировать их посредством Movable, Clickable и прочих интерфейсов. В идеале целевой набор функционала (далее по тексту traits) должен сам "обновлять" требуемый объект. К примеру, имеем список сотрудников в таблице, к каждому имеем анотации отображаемые в боксе внизу экрана. Одним кликом этот бокс можно превратить в плавающее окошко (на малых экранах увлечить по вертикали отображаемую область), причём ни один из компонентов на странице не будет "знать" об этих трансформациях бокса:
Таким образом можно как угодно изменять объект, не очерчивая заранее какие-либо ограничения. Естественно, другие компоненты должны предпологать, что их целевой объект может внезапно измениться. Так, в примере размеры слоя должны при каждой отрисовке опрашивается вновь, а не записывается во внутренние переменные. Как видим, подход очень гибкий, настолько, как указатель void* в C. Отсюда множество споров, безопаснен ли такой подход и не будет ли он убивать большие проекты. Отметим что на JS вы вряд ли будете писать более 50кб кода, следовательно, больших проектов не будет, и подход очень удобен... в умелых руках Перейдём к prototype.js:
Метод в прямом смысле копирует всё из одного объекта в другой. Если целевым объектом будет некий объект, то расширим только его, если же прототип конструктора, то расширим все объекты, порождённые от этого конструктора. (* Object не является "родительским" для HTML и прочих элементов, поэтому расширять Object.prototype не имеет большого смысла. В Мозилле и Опере есть W3C'сшные HTMLElement и прочие интерфейсы, с помощью которых можно расширять DOM, но ИЕ их пока не поддерживает *) Просто и красиво, если бы не одно но: разные браузеры по-разному "читают объект" конструкцией for.. in (пинать стандарт ECMA-262), например мозилла листает все поля, в том числе и стандартные toString, унаследованные от Object, в то время как ИЕ только определённые пользователем явно. Предопределённые "методы" являются нативными (native, зашитый в движок, поддерживаемый бинарными либами браузера), переопределение их может приниматься браузером как:
Другой способ обойти конфликты имён с нативными - использовать префикс в именах, я часто пользую тильду: '~'. Это сообщение отредактировал(а) 12345c - 31.7.2006, 14:48 |
||||||||
|
|||||||||
Sardar |
|
|||
Бегун Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: нет Всего: 317 |
Код в целом был краток, описание многословным, считаю первое плюсом JS, второе можете скинуть на мою болтливость (пытался сделать короче... ). В base.js находиться много интересного, но рассмотренно оно будет в отдельном топе. В частности разберём и дополним работу с функциями, ибо функции это одна из основ JS, владение ими и вообще умение строить целые выражения есть та самая необходимая основа, от которой будем отталкиваться строя более функциональный код.
Топ открыт для коментариев -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
vasac |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: нет Всего: 36 |
Осмелюсь высказать свое скромное ИМХО.
JS является слаботипизированным языком с объектной моделью, основанной на прототипах. И в этом кроются основные проблемы для начинающих js-программистов, так как большинство из них приходит к js после изучения жесткотипизированных языков. И тут нужно определиться для чего нужен данный фреймворк: — Для удобства начинающих. Тогда можно вводит подобия классов и подгонять js под то чем он не является в принципе. При этом вышеозначенные начинающие смогут на нем создавать относительно сложные вещи даже не понимая самой сути js. — Либо же он предназначен для создания действительно сложных вещей с использованием всех возможностей js. Но для того чтобы использовать все эти немалые возможности нужно использовать чистый js в том виде в котором он есть, даже если это может кому-то казаться непривычным. |
|||
|
||||
Sardar |
|
||||
Бегун Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: нет Всего: 317 |
vasac, скорее второе. Писать Java подобное:
и прочие громоздкие вещи мы не будем. Цель была пояснить что есть Class.create() из prototype.js, как им пользоваться и главное - нужно ли это нам. Синтаксис удобен, хотя как я говорил раньше из-за проблем с конструктором лучше:
Синтаксис становиться несколько более привычным для пришедших из class-based ООП языков. Только синтаксис, методология JavaScript будет навязываться что бы научить писать эффективно. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||
|
|||||
cruelangel |
|
|||
Опытный Профиль Группа: Участник Сообщений: 319 Регистрация: 12.9.2007 Репутация: нет Всего: 8 |
как я неоднократно отмечал классы совершенно не нужны ни яваскрипту, ни ООП вообще
|
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | ViJio - фреймворк для JS | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |