Обновить
137
0
Владимир Губарьков@xonix

CTO

Отправить сообщение
Да, если кто-то знает еще реализации — пишите — добавим в коллекцию.
Каждый программист на javascript должен написать свою реализацию классов. ©

Dojo — dojotoolkit.org/reference-guide/dojo/declare.html#dojo-declare
Sencha (ExtJS) — www.rogerwilco.ru/2011/04/sencha-extjs.html
qooxdoo — qooxdoo.org/documentation/0.7/oo_feature_summary
MooTools — www.phpeveryday.com/articles/MooTools-Basic-Creating-Classes-MooTools-P919.html
Prototype — www.prototypejs.org/learn/class-inheritance
AtomJS — github.com/theshock/atomjs/blob/master/Docs/Class/Class.md
JSClass — jsclass.jcoglan.com/classes.html
code.google.com/p/jsclassextend/
github.com/jcoglan/js.class
Cobra — justin.harmonize.fm/index.php/2009/01/cobra-a-little-javascript-class-library/
github.com/JustinTulloss/cobra
The $class Library- www.uselesspickles.com/class_library/
Classy — classy.pocoo.org/
YUI 3 — www.yuiblog.com/blog/2010/01/06/inheritance-patterns-in-yui-3/
Coffee-Script — jashkenas.github.com/coffee-script/#classes
JavascriptClasses — code.google.com/p/javascript-classes/
AJS — amix.dk/blog/post/19038
jsFace — github.com/tannhu/jsface
JsOOP — jsoop.codeplex.com/
joot — code.google.com/p/joot/wiki/API
oopsjs — code.google.com/p/oopsjs/
Objs — github.com/tekool/objs/wiki
oorja — maxpert.github.com/oorja/
objx — code.google.com/p/objx/wiki/OClass
jsclassextend — code.google.com/p/jsclassextend/
prolificjs — code.google.com/p/prolificjs/wiki/OOP
objectize — code.google.com/p/objectize/

code.google.com/p/core-framework/wiki/Inheritance
code.google.com/p/sfjsoo/
code.google.com/p/jslproject/
code.google.com/p/magic-classes/wiki/MagicClassesOverview

github.com/ded/klass
github.com/jiem/my-class
github.com/kilhage/class.js
github.com/Jakobo/Sslac
github.com/BonsaiDen/neko.js
github.com/finscn/GT-Class
github.com/deadlyicon/klass.js
github.com/neuromantic/CodeJS
github.com/cj/js-oo
github.com/darthapo/klass.js
github.com/nemisj/zet.js
github.com/k33g/species
github.com/benekastah/JS-Class
github.com/tobeytailor/def.js
github.com/rstrobl/squeakyJS
github.com/shinyplasticbag/MojoClass
github.com/firejune/class
github.com/gcoguiec/jquery-class
github.com/daffl/JS.Class
github.com/pavelz/class.js
github.com/zerodogg/jqsimple-class
github.com/bnoguchi/class-js
github.com/arian/Klass
github.com/kuwabarahiroshi/joo
github.com/iamleppert/SimpleClass
github.com/aenoa/Noode.js
github.com/stomlinson/SuperClass
github.com/jzimmek/klazz
github.com/kbjr/class.js
github.com/jhnns/node.class
github.com/borysf/declare/blob/master/declare.js
github.com/ShadowCloud/BF-Class
github.com/pic-o/jsClass
github.com/rosamez/jquery.klass
github.com/yuki-kimoto/javascript-Class_Simple
github.com/yaksnrainbows/jarb
github.com/thirashima/UnderClass
github.com/arahaya/package.js
github.com/arieh/Class.def
github.com/bogdan-dumitru/jsClass
github.com/pomke/pomke.js
github.com/sgolasch/jClassify
github.com/kbjr/Classy
github.com/cthackers/jClass
github.com/davidjbeveridge/Clasico
github.com/edave64/protojazz
github.com/mrac/solid.js
github.com/benekastah/Classy
github.com/damianmr/JSMiniClass
github.com/benekastah/classesWithCash
github.com/dialog/Resig-Class
github.com/mpodriezov/OJS
github.com/dtinth/twcs.js
github.com/percyhanna/js-class
github.com/jalopez/SimpleClassJS
github.com/jhamlet/proteus
github.com/petebrowne/classify
github.com/TdroL/Classy.js
github.com/azendal/neon
github.com/aulizko/Alan-Point-JavaScript-Library/tree/master/src/oop
Да ладно, есть рекомендации W3C которые почти стандарты. Есть всякие тесты типа Acidtests.
Как раз вопросы совместимости сейчас очень даже актуальны именно для самих браузерописателей.
Не даром в гонку стандартов даже MS включился, хотя всегда делал по-своему.
> Потому что никто не занимается популяризацией JS, как нормального, полноценного языка. Подавляющее большиснтво программистов до сих пор считают его этаким мелким скриптовым языком и пытаются подходить к нему с точки зрения своих колоколен.

Не удобно, вот и не популяризируют. Сваяли свои классовые обертки — и погнали. Уж писателей-то тех JS-библиотек сложно упрекнуть в незнании JS. Стало быть, они спроектировали библиотеки именно так как им было удобно. Использовать (цитирую) вполне удобные языковые примитивы, чтобы удобно писать prototype-based OO-код, видимо, на практике оказалось не так уж и удобно.

> Что такое общий знаменатель?

Хотя-бы то, что сделал Adobe в AS2 / AS3, для начала. Т.е. упрятать потроха из прототипов поглубже в реализацию. Впрочем, вроде, ECMAScript туда потихоньку движется.

> Да, кстати, если вы анчнете говорить про ООП в стиле С++

Читаем мой корневой в этой теме комментарий:

Весьма хорошо. Давно пора было ввести нормальные классы в JS. А теперь почти Java в моём браузере. Ждем вменяемой реализации в браузере.


Не совсем. В 2 и тем более 3 версии прототипы — не более чем implementation details. Это к тому, что сахар — это факультативное удобство — (хочешь — используй, хочешь — нет), а классы в AS2 и AS3 — это более-менее обязательное требование.
Цитата как бы намекает на широту и продолжительность обсуждения этого элемента дизайна языка Javascript.
> хороший пример, на мой взгляд, в AtomJS: github.com/theshock/atomjs/blob/master/Docs/Class/Class.md

Отлично, еще один пример в мою копилку.

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

Именно.
> ничего не говорит о качестве обдумывания и проектирования — это раз

… и тайком протащить туда его спасительные фишки: first class functions (замыкания сделал позже, но они были частью плана сразу) и прототипы (примерно как в языке Self).
> Ruby

И где там прототипы?

> ActionScript 3

Так они же еще в версии 2 вроде перешли на классы, нет?
> Поэтому не надл натягивать на язык то, для чего он не создавался

Все так на полном серьёзе считают прототипы обдуманным решением. Интересно, если на начальную версию языка понадобилось 10 дней, то сколько времени было потрачено на предварительное обдумывание и проектирование?
> Не нужно никакого «классового ООП» в JS.

Можно спорить долго, но факт остаётся фактом: JS — единственный популярный язык с ООП на прототипах, да и в нем в конечном итоге все ваяют классы поверх прототипов а дальше по старинке.
Мой шире… Еще заменить прототипное ООП на классовое и выкосить неявное приведение типов, а с ним все приколы с "==".
А можно огласить Ваш список? Хочу сверить со своим…
В том числе именно поэтому Гугл ваяет Dart на замену JS.

> Абсолютно верно, Python — прототипный язык с классам в виде «сахара».

Да ладно? И как же на питоне будет выглядеть создание нового объекта на основе прототипа из существующего объекта?
> Вряд ли — я не собираюсь с Вами спорить.

Но Вы уже поспорили, самим фактом ответа.

> Ну в целом, пожалуй, надеюсь, моя аргументация осталась понятна Вам, а Ваша, кажется, мне.

Согласен, что спор можно прекращать, по причине того, что аргументы оппонентов стали ясны друг другу, несмотря на несогласие с ними.
> Ничего подобного. Я просто декларирую: прототипный подход не лучше и не хуже классового. Точка.

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

> некая инициативная группа в составе гугла просто не понимает прототипную парадигму и стремится навязать взамен классовую

Вы правда в это верите?

> Дальнейшая практика показала только то, что при тотальном преподавании в вузах классового ООП освоение каких-либо других концепций становится абсолютно непреодолимым барьером для 90% выпускников этих вузов.

Дело не в сложности концепции прототипов. Из приведенного Вами же трактата:

> When compared to class-based
languages, prototype-based languages are conceptually simpler, ...


А дело в том, что она попросту неудобна. Хочешь — не хочешь, но при усложнении системы удобнее думать и строить её в терминах классов, а их в JS-то и нету, приходится изобретать, что и демонстрирует обсуждаемая статья и сотни ей подобных. Вы же утверждаете что все кто так делают просто «дураки и не лечатся» (не буквально :-) ).

Ну в целом, пожалуй, надеюсь, моя аргументация осталась понятна Вам, а Ваша, кажется, мне.

Ближе — не ближе — это уже досужие домыслы. Факт же в том, что в питоне есть классы из коробки, а в JS — нету. И, потому, в JS все городят свою реализацию классов. И при этом нас упорно убеждают что в этом нет никакой проблемы.
В питоне действительно нет. Никому не придет в голосу изобретать своё ООП. Ладно, вру, придет. Но уж точно не придет применять это в реальном проекте, просто потому что незачем.

Ниже Вы писали

> Кстати, вот отличная демонстрация «чистого» АОП в Javascript — habrahabr.ru/blogs/webdev/131690/. Понятно, что можно навешивать и на конкретный объект, и на прототип. Python так уже не сможет.

Все-таки признайте уж свою ошибку.
> Вы ожидаете, что я встряну в этот холивар? Зачем?

Начнем с того, что Вы уже встряли в него.

> Тут давно уже не просто миллион копий сломан, а прямо научные трактаты написаны:
Classes vs. Prototypes. Some Philosophical and Historical Observations


Копий сломано да, но то ли еще будет.
Трактат хороший, да. Но, во первых, философия (из трактата) и практика — «две большие разницы». А по части практики (точнее, практичности) этот трактат вряд-ли актуален, т.к. написан лишь год спустя создания JS, принесшего идею прототипов в широкие массы, когда все плюсы и минусы этого подхода были еще не вполне исследованы на практике. А вот дальнейшая практика как раз показала, что более прагматичным является подход классического ООП.
> В классовом же языке нельзя изменить класс после его объявления, поэтому создаются хаки, завязанные на изменение полученного низкоуровневого кода. В интерпретируемых языках типа Ruby с этим получше — тоже через reflection, но изменяется сам исходный код, правда, через «костыли» типа eval.

Что-то Вы опять ошибаетесь.

>>> class A:
	def method(self):
		self.field+=2

		
>>> a = A()
>>> a.field = 5
>>> a.method()
>>> def p(s): print s

>>> def aop(pre_f, post_f):
	def decorate(f):
		def decorated(*args):
			pre_f(*args)
			f(*args)
			post_f(*args)
		return decorated
	return decorate

>>> def print_field(self, msg):
	print msg, self.field

>>> A.method = aop(lambda self: print_field(self,'Field before method:'), lambda self: print_field(self, 'Field after method:'))(A.method)
>>> a.method()
Field before method: 7
Field after method: 9

Информация

В рейтинге
Не участвует
Дата рождения
Зарегистрирован
Активность