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

Kolyaj 02.03.2009 21:32

Благополучно забыв, что в вашей статье описывается (т.е. читая вышеприведеный код без знания вашего механизма наследования), я не понимаю, что делают функции $class и самая первая.

Во-вторых, определение функций в конструкторе а-ля this.someMethod = function() {} создает для каждого объекта свой набор методов, вместо ссылок на прототип.

Pavel_Volodko 02.03.2009 21:50

Цитата:

Сообщение от Kolyaj (Сообщение 13442)
Благополучно забыв, что в вашей статье описывается (т.е. читая вышеприведеный код без знания вашего механизма наследования), я не понимаю, что делают функции $class и самая первая.

Во-вторых, определение функций в конструкторе а-ля this.someMethod = function() {} создает для каждого объекта свой набор методов, вместо ссылок на прототип.

Ага! :victory: Значит, что делает функция $extends() понятно. Соответственно, не всё так плохо (имеется ввиду в моей "обёртке").

Первая функция - конструктор класса DerivedClass (исправил название класса в предыдущем посте).
Функция $class() - нужна для "финальной сборки" класса.

Об этом, правда, подробнее можно узнать из статьи. Нет смысла здесь дублировать.

Что касается "определение функций в конструкторе а-ля this.someMethod" - эту проблему тоже решает функция $class().
Функция someMethod создается только один раз для всего класса.

P.S. Спасибо за отзыв :yes:

Kolyaj 02.03.2009 21:59

Вы не поняли, я не прошу объяснять код, а говорю, что если мне придется читать подобный код, уйдет слишком много времени на осмысливание обертки.

Лично у меня сейчас модифицированный способ из Prototype, в Ext'е похожий по использованию.
var A = Class.create({
    init: function() {
    },

    method1: function() {
    },

    method2: function() {

    }
});

var B = Class.extend(A, {
    init: function() {
    },

    method3: function() {
    },

    method4: function() {

    }
})

Pavel_Volodko 02.03.2009 22:08

Первое, что мне лично не нравится - Prototype (как и многие другие фрэймворки) создаёт "наследование" путём копирования свойств и методов из одного класса в другой. Полагаю instanceOf тут не работает?

Второе - а как насчет вызова конструктора и методов базового класса? Вот это на самом деле и есть главная задача. По крайней мере, моя.

Kolyaj 02.03.2009 22:13

Цитата:

Сообщение от Pavel_Volodko
создаёт "наследование" путём копирования свойств и методов из одного класса в другой

Неверное предположение.

Цитата:

Сообщение от Pavel_Volodko
а как насчет вызова конструктора и методов базового класса?

var B = Class.extend(A, {
    init: function() {
        B.superclass.init.apply(this, arguments);
    }
});

Pavel_Volodko 02.03.2009 22:49

Цитата:

Сообщение от Kolyaj (Сообщение 13451)
Неверное предположение.

Разве?

Ну, посмотрим в Prototype (version 1.6.0.3, метод Class.create()):

...
for (var i = 0; i < properties.length; i++)
      klass.addMethods(properties[i]);
...


Хотя instanceof, надо признать, всё же работает (для вашего примера).

Kolyaj 02.03.2009 22:55

Это не наследование реализуется, а новые методы навешиваются. Наследование там стандартное
klass.prototype = new subclass;


Впрочем сейчас в Prototype слишком много всего непонятно для чего.

Pavel_Volodko 02.03.2009 22:59

Цитата:

Сообщение от Kolyaj (Сообщение 13457)
Это не наследование реализуется, а новые методы навешиваются. Наследование там стандартное
klass.prototype = new subclass;


Впрочем сейчас в Prototype слишком много всего непонятно для чего.

Вот и я о том же. "Навешивание методов" из той же оперы.

Zeroglif 02.03.2009 23:18

Pavel_Volodko,

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

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

Kolyaj 02.03.2009 23:19

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


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