Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   "Классический" ООП в JavaScript (https://javascript.ru/forum/misc/2740-klassicheskijj-oop-v-javascript.html)

Zibba 02.03.2009 23:21

Pavel_Volodko,
И мелкий же шрифт исходников у Вас в блоге, чуть глаза не сломал :/

x-yuri 03.03.2009 03:53

Цитата:

Я просто хотел узнать насколько необходимо использование оберток в реализации наследования
имхо, наследование на основе прототипов - естественное для javascript. Мне вот интересно, для чего эмулировать классическое наследование? Для людей которые к нему привыкли? Или есть еще причины?

p.s. эмулировать классическое наследование не сложнее чем использовать наследование, основанное на прототипах? Т.е. естественный вариант должен быть проще, по идее

Zeroglif 03.03.2009 13:16

Цитата:

Сообщение от x-yuri
Или есть еще причины?

Реюз со своими тараканами. Например, автор характеризует классовое наследование, как:
Цитата:

1. Возможность четкого определения принадлежности объекта классу (instanceOf)
Чёткость в js почти невозможна ;) , а instanceоf ни разу не показывает принадлежность к "классу".
Цитата:

2. Возможность вызова конструктора или любого метода базового класса
Так ли важно цепляться за структуру, сохраняя суперы? Не знаю, у каждого свои тараканы.

Dmitry A. Soshnikov 03.03.2009 13:45

Цитата:

Сообщение от Zeroglif
Реюз со своими тараканами.

Вероятно, это единственная причина подобных (удобных, относительно своих тараканов) обёрток.

Pavel_Volodko 03.03.2009 15:17

Цитата:

Сообщение от Zeroglif (Сообщение 13462)
Pavel_Volodko,

Сходу скачал только финальный вариант, сразу возник вопрос - почему передаются функции, а не заранее созданный объект-прототип? В смысле, в чём фишка? ;)

upd а, идею функций понял, нужен верный $className...
upd2 и не хочется копировать...

Не совсем понял что значит "нужен верный $className"...
Фишка действительно в использовании функции вместо объекта-прототипа. Хотя, на самом деле, всё гениальное просто: для создания связной иерархии классов нужно цеплять прототипы к функциям-конструкторам. Имея только объект-прототип, мы такой возможности не имеем. Приходится извращаться со всякими __proto__, копированием методов или созданием фэйковых подклассов. А вот имея функцию-конструктор для создания объекта-прототипа всё делается элементарно.

upd копировать и не обязательно. Я сам очень настороженно отношусь к решениям, которым мне не до конца понятны. Я просто поделился тем, что сделал под себя. Just FYI, как говорится.

Цитата:

Сообщение от Kolyaj (Сообщение 13463)
А чем ваш способ this.method = function() {} отличается от приведенного прототайповского? (ну кроме того, что в прототайпе лучше тем, что вешается все на prototype)

В принципе, описано чуть выше.
На мой взгляд, достаточно заглянуть в метод Class.create() от Prototype, чтобы задаться кучей вопросов. Кроме того, выражение "вешается все на prototype" мне кажется странным (хотя, думаю, я понимаю что вы имеете ввиду) и уж тем более я не считаю это лучшим решением.

Kolyaj 03.03.2009 15:36

Цитата:

Сообщение от Pavel_Volodko
На мой взгляд, достаточно заглянуть в метод Class.create() от Prototype, чтобы задаться кучей вопросов.

Когда я привожу в пример Prototype, я имею в виду версию где-то 1.5, где было еще поменьше лишнего. Другими словами принцип, а не реализация.

Цитата:

Сообщение от Pavel_Volodko
Кроме того, выражение "вешается все на prototype" мне кажется странным

Свойство -- prototype, фреймворк -- Prototype.

Pavel_Volodko 03.03.2009 15:37

Цитата:

Сообщение от Zibba (Сообщение 13464)
Pavel_Volodko,
И мелкий же шрифт исходников у Вас в блоге, чуть глаза не сломал :/

Звиняйте, уж больно много кода было. В следующий раз будет по-крупнее.

Цитата:

Сообщение от x-yuri (Сообщение 13490)
имхо, наследование на основе прототипов - естественное для javascript. Мне вот интересно, для чего эмулировать классическое наследование? Для людей которые к нему привыкли? Или есть еще причины?

p.s. эмулировать классическое наследование не сложнее чем использовать наследование, основанное на прототипах? Т.е. естественный вариант должен быть проще, по идее

Дело не в эмулировании. Дело в том, что я расширяю стандартные возможности javascript или пытаюсь сделать что-то немного удобнее для использования при разработке. Если решение мне помогает - цель достигнута.
Насчет "естественный вариант должен быть проще, по идее" - проще не значит лучше. Я и сам за простые решения.
Кстати, с этой точки зрения, моё решение абсолютно естественное, т.к. построено на элементарных возможностях прототипного наследования.

Pavel_Volodko 03.03.2009 15:46

Цитата:

Сообщение от Zeroglif (Сообщение 13520)
Реюз со своими тараканами. Например, автор характеризует классовое наследование, как:

Чёткость в js почти невозможна ;) , а instanceоf ни разу не показывает принадлежность к "классу".

Так ли важно цепляться за структуру, сохраняя суперы? Не знаю, у каждого свои тараканы.

Я бы даже сказал: "чёткость в javascript - понятие расплывчатое" :agree:

По поводу instanceоf - по-подробнее плиз :stop:

Что касается "цепляться за структуру, сохраняя суперы" - только там где это нужно, естественно.

Цитата:

Сообщение от Dmitry A. Soshnikov (Сообщение 13526)
Вероятно, это единственная причина подобных (удобных, относительно своих тараканов) обёрток.

Тараканы - двигатель прогресса (c) :yes:

Zeroglif 03.03.2009 16:02

Цитата:

Сообщение от Pavel_Volodko
А вот имея функцию-конструктор для создания объекта-прототипа всё делается элементарно.

Не намного элементарнее. Вы объединили несколько задач в одну. Цепочка наследования (делегирования) выстраивается с помошью объекта-прототипа, созданного "промежуточным" конструктором в стиле (паттерн by Lasse Reichstein Nielsen):

function inheritObject(object) { 
  function Dummy(){}; 
  Dummy.prototype = object; 
  return new Dummy(); 
}


Одновременно вместо Dummy для "подклассов" используется заранее подготовленная и заложенная в функцию структура. То есть, получив правильно прилинкованный объект-прототип, вы вместо:

Person.prototype.x =//...
Person.prototype.y =//...


используете:
this.x = //...
this.y = //...


что, в принципе, почти то же самое кроме доступа к локальным переменным функции из методов. Отсюда 2 вывода - то ли вам важны локальные переменные ($className), то ли вам не нравится "обвешивать" объект-прототип руками или через for-in...

Zeroglif 03.03.2009 16:15

Цитата:

Сообщение от Pavel_Volodko
По поводу instanceоf - по-подробнее плиз

instanceof не оправдывает своего названия буквально и является терминологической натяжкой из чужого class-based мира, в js объекты наследуют от объектов, понятия "класс" не просто нет, а если бы оно даже и было, то мы бы столкнулись с задачей определения, что включить в этот термин - прототип или прототипы, конструктор или конструкторы, или всё вместе, что участвовало в создании цепочки или её составляет, при этом, если цепь прототипов после содания хе-хе "instance" можно считать стабильной и связанной с ним, то свойству 'prototype' конструкторов можно присваивать другие значения, что делает алгоритм instanceof в этом случае бесполезным.


Часовой пояс GMT +3, время: 22:13.