Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Эмуляция ООП (Александр Михалицын)
Author Message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1298
Карма: 78
   поощрить/наказать


PostPosted: Mon Apr 06, 2009 5:41 pm (написано за 7 минут 55 секунд)
   Post subject: Эмуляция ООП
Reply with quote

От меня небольшая реализация.

Несмотря на одинаковое название, эта реализация отличается от реализации от ДК. Хотя результат выполнения будет таков же.
В качестве аргумента, должен передаваться конструктор, но не созданный функцией newClass, а созданный при помощи привычного (function() {}, new Function('...')).
Это сделано, чтобы каждый раз создавался новый экземпляр исходного объекта, а не делился на все экземпляры класса, созданного через newClass.

Ниже лежит архив, в котором лежит "example of using". Для вызова методов базового класса, используется свойство parent (this.parent.свойство/метод), конечно, как и в "настоящем" ООП обращаться к свойствам/методам через parent, требуется если только, они были переопределены в производном классе.
По умолчанию, методы из parent вызываются в ТЕКУЩЕМ контексте, а не контексте parent, однако вы знаете что есть call, apply...


class.zip
 Description:
v.2.0

Download
 Filename:  class.zip
 Filesize:  1.4 KB
 Downloaded:  671 Time(s)



Last edited by Александр Михалицын on Fri Nov 12, 2010 2:11 pm; edited 3 times in total
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Mon Apr 06, 2009 10:06 pm (спустя 4 часа 24 минуты; написано за 3 минуты 35 секунд)
   Post subject:
Reply with quote

ругается

тут (3, 9) Microsoft JScript compilation error: Expected identifier
Code (JavaScript): скопировать код в буфер обмена
   var class = function()
и

тут (25, 21) Microsoft JScript compilation error: Syntax error
Code (JavaScript): скопировать код в буфер обмена
                  }.call(this, this.parent[this.k]);
лечится исправлением s/class/clazz/g в первом случае
и обертыванием безымянной функции в вызов
Code (JavaScript): скопировать код в буфер обмена
( ... ).call(this, ...
В целом вроде бы логично.
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1298
Карма: 78
   поощрить/наказать


PostPosted: Tue Apr 07, 2009 9:46 am (спустя 11 часов 39 минут; написано за 23 секунды)
   Post subject:
Reply with quote

Rumata,
угу. Вчера уже исправил, но уже в оффлайн. ;) Есть еще недочеты буду править.
Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1298
Карма: 78
   поощрить/наказать


PostPosted: Tue Apr 07, 2009 10:06 am (спустя 20 минут; написано за 33 секунды)
   Post subject:
Reply with quote

Фикс версия 1.1. Исправил бяку с контекстом. Методы базового класса должны вызываться в контексте производного,
а у меня там бяка... :)
Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1298
Карма: 78
   поощрить/наказать


PostPosted: Tue Apr 07, 2009 10:07 am (спустя 1 минуту 11 секунд; написано за 50 секунд)
   Post subject:
Reply with quote

Со вследующей версии введу понятие ООП конструктора, а не конструктора с точки зрения JavaScript. Обратной совместимости (и прямой) между классами, конечно не будет...
Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1298
Карма: 78
   поощрить/наказать


PostPosted: Tue Apr 07, 2009 5:33 pm (спустя 7 часов 26 минут; написано за 2 минуты 20 секунд)
   Post subject:
Reply with quote

Версия 2.0. Введено понятие конструктора (с точки зрения ООП) название "__construct", если в исходной функции не определен метод __construct кидается исключение...
Конструктор базового класса, необходимо вызывать вручную.

В дальнейшем возможно добавление: protected, static членов. =) Знаю, изврат, но эмуляция ООП уже изврат, зачем останавливаться? =)
Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1298
Карма: 78
   поощрить/наказать


PostPosted: Wed Apr 08, 2009 4:38 pm (спустя 23 часа 4 минуты; написано за 1 минуту 41 секунду)
   Post subject:
Reply with quote

Вобщем версия v.2.1 вот (был небольшой баг).

Что касается static/public/protected для методов-то я написал, а вот для свойств нужны __defineSetter__, __defineGetter__. Которые, конечно, не поддерживаются в IE... :(
Боюсь, подругому никак не реализовать... :(


class.zip
 Description:
v.2.1

Download
 Filename:  class.zip
 Filesize:  1.4 KB
 Downloaded:  659 Time(s)

Back to top
View user's profile Send private message Send e-mail
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1298
Карма: 78
   поощрить/наказать


PostPosted: Thu Mar 18, 2010 2:23 pm (спустя 11 месяцев 9 дней 21 час 45 минут; написано за 42 секунды)
   Post subject:
Reply with quote

Так, либа не умерла, в ближайшее время выпущу версию 3.0, с поддержкой абстрактных классов и интерфейсов... =)
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML