Comments 84
Поздравляю, вы изобрели mootools
+19
Не нашёл особого сходства. Вы второй пример разбирали?
P.S. И почему все сразу приводят примеры про Animal? :)
P.S. И почему все сразу приводят примеры про Animal? :)
+3
В мутулсе точно так же класс создается хешем, некоторые элементы которого являются кейвордами и обозначают наследование (втч множественное), конструкторы, деструкторы итп. Мутулс вообще очень сильно расширяет ООП яваскрипта, которое там, между прочим, есть и без фреймворков.
И Мутулс не один такой, ниже есть потрясающий комментарий.
И Мутулс не один такой, ниже есть потрясающий комментарий.
0
Немного ИМХО про mootools.
1. Implements во всех языках обозначает, что класс должен реализовывать некий интерфейс, интерфейс — не содержит в себе никакой логики. Мутулс же копирует свойства обьекта, а значит по сути расширяет обьект. Следовательно это Extends, а не Implements (если я всё правильно понял).
2. Вызов родительского класса типа this.parent(age) — лишнее звено. Средствами языка такой вызов делается Animal.call(this, age)
3. initialize — не нравится мне такое название конструктора. Вот почему везде это constructor (construct), а тут initialize?
Правда, создание класса через new Class(...) мне понравилось. Возможно, я тоже так сделаю.
И, конечно, это всё мелочи, на которые можно и не обращать внимания.
1. Implements во всех языках обозначает, что класс должен реализовывать некий интерфейс, интерфейс — не содержит в себе никакой логики. Мутулс же копирует свойства обьекта, а значит по сути расширяет обьект. Следовательно это Extends, а не Implements (если я всё правильно понял).
2. Вызов родительского класса типа this.parent(age) — лишнее звено. Средствами языка такой вызов делается Animal.call(this, age)
3. initialize — не нравится мне такое название конструктора. Вот почему везде это constructor (construct), а тут initialize?
Правда, создание класса через new Class(...) мне понравилось. Возможно, я тоже так сделаю.
И, конечно, это всё мелочи, на которые можно и не обращать внимания.
0
И как добавлять в мутулс статические свойства в обьект?
После его создания типа Cat.staticPtop1 = 'sdf'?
При этом new Class теряет целостность.
После его создания типа Cat.staticPtop1 = 'sdf'?
При этом new Class теряет целостность.
0
1, 3 — согласен, странно. Может быть они сделали это во избежание совпадения кейвордов в будущем, а может потому, что в яваскрипте прототипное наследование — чтобы не смешивать терминологию. Хотя если честно, мне всегда казалось Init более подходящим для конструктора названием.
2. Зато так мы можем напрямую не указывать в нескольких местах кода от чего унаследован класс. Во большинстве ООПшных языков вызов parent есть, почему бы не добавить это и в жс.
2. Зато так мы можем напрямую не указывать в нескольких местах кода от чего унаследован класс. Во большинстве ООПшных языков вызов parent есть, почему бы не добавить это и в жс.
0
Мне кажется, было-бы лучше примеры кода спрятать под
+1
Эм… По-моему CoffeeScript выглядит лучше. ИМХО конечно же…
+1
По моему CoffeeScript создали по прихоти рубистов и любому javascript прогеру его синтаксис совсем не удобен. Тогда уж я могу сказать «Давайте писать на Dart», или на другом языке транслируемом в js.
Тут же обсуждается именно реализация на следования в js.
Тут же обсуждается именно реализация на следования в js.
+3
Ну так по сути делает тоже самое. И я бы не сказал что синтаксис, который тут предлагают намного удобней CS.
0
CoffeeScript это скажем так вообще не js, это язык который создан по образу и подобию руби и который транслируется в js.
Если вы пишите на руби то может быть CoffeeScript для вас все, я для себя там ничего удобного не видел. По сути там далеко не тоже самое.
Также замечу тут предлагают не синтаксис а реализацию на javascript, не надо это путать, у Javascript один синтаксис.
Если вы пишите на руби то может быть CoffeeScript для вас все, я для себя там ничего удобного не видел. По сути там далеко не тоже самое.
Также замечу тут предлагают не синтаксис а реализацию на javascript, не надо это путать, у Javascript один синтаксис.
0
Хм… я бы сказал что CS больше похож на Erlang, чем на руби. Вы не поверите но CoffeeScript это тоже реализация на JS.
-1
Что вы вкладываете в эти слова? CoffeeScript — это язык со своим синтаксисом, который при компиляции выдает javascript код. Я об этом писал выше. во что я не должен поверить по вашему?
0
какая компиляция? Вы о чем? Можно подключить jashkenas.github.com/coffee-script/extras/coffee-script.js и писать на CS без предварительной компиляции.
+2
UFO just landed and posted this here
И почему каждому второму хочется самому реализовать «множественное наследование» в JavaScript? Зачем вам множественное наследование? Оно вам точно надо? В подавляющем большинстве случаев эта задача решается аггрегированием либо использованием mixin, что не уродует иерархию наследования. Посмотрите, как реализовано ООП в YUI3, вам полезнее будет для развития.
+14
Использовать множественное наследование или нет решать разработчику. В Java и Python к примеру оно есть. Предположу, что, как и всегда, его нужно использовать с умом.
С помощью моего конструктора вы можете легко использовать и классы-примеси, помещая их в extend. Так же можно и подобие интерфейса использовать(класс со всеми абстрактными методами).
Код даёт возможность использования тех технологий, которые выберет для себя разработчик.
С помощью моего конструктора вы можете легко использовать и классы-примеси, помещая их в extend. Так же можно и подобие интерфейса использовать(класс со всеми абстрактными методами).
Код даёт возможность использования тех технологий, которые выберет для себя разработчик.
-3
Каждый программист на 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
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
+97
Да, если кто-то знает еще реализации — пишите — добавим в коллекцию.
+6
Мой самопал: bitbucket.org/xexsus/js-class/src
Может не самое мощное решение, но зато простейшее, и на практике отлично себя зарекомендовало.
Может не самое мощное решение, но зато простейшее, и на практике отлично себя зарекомендовало.
+1
Вот моя реализация: habrahabr.ru/blogs/javascript/40909/ =)
+1
RightJS забыли
0
И ещё нативный Object.create
0
UFO just landed and posted this here
Значит я всё сделал правильно Ж8-)
+5
в мемориз!
+2
Очень странно, уже довольно давно пишу на клиентском JS и ни разу мне не приходила в голову идея написать свою (или даже взять чужую) реализацию ООП. Не то чтобы необходимость в этом полностью отсутствует, но интерфейсы относительно легко пишутся и нативными средствами (хотя обычно я использую фреймворк).
Получается, что ООП в JS для меня как инструмент с узким кругом задач под него.
Получается, что ООП в JS для меня как инструмент с узким кругом задач под него.
+2
> Получается, что ООП в JS для меня как инструмент с узким кругом задач под него.
Да, обычно это имеет смысл лишь при написании крупных фреймворков, например при создании GUI фреймворка вроде ExtJS.
Да, обычно это имеет смысл лишь при написании крупных фреймворков, например при создании GUI фреймворка вроде ExtJS.
+1
В том то и дело, я сам автор одного GUI-фреймворка, но за полтора года работы над ним, так и не смог понять зачем кому-то переносить ООП в JS «как есть». Единственная причина, это пожалуй, возможность использовать одну и ту же (или опять таки «похожую») архитектуру на клиенте и сервере.
+1
все-таки чего-то не хватает.
пойду писать свою.
пойду писать свою.
+2
какой полезный списочек, в мемо :)
0
Странные вы. Любой разработчик с первого взгляда найдёт фатальный недостаток ( lurkmore.to/Фатальный_недостаток ) в каждой из этих реализаций.
0
Совсем забыли описать тонкости документирования(jsdoc) классов создаваемых через фабрики.
+3
Ребята вот подборка книг хорошая:
— JavaScript: The Definitive Guide, 5th Edition By David Flanagan
— Pro JavaScript Techniques by John Resig
— Pro JavaScript Design Patterns by Dustin Diaz and Ross Harmes
— JavaScript: The Good Parts by Douglas Crockford
Прочитайте вдумчиво, через пол года практики 100к+ гарантирую.
Нужно читать правильных авторов.
— JavaScript: The Definitive Guide, 5th Edition By David Flanagan
— Pro JavaScript Techniques by John Resig
— Pro JavaScript Design Patterns by Dustin Diaz and Ross Harmes
— JavaScript: The Good Parts by Douglas Crockford
Прочитайте вдумчиво, через пол года практики 100к+ гарантирую.
Нужно читать правильных авторов.
+7
У Флэнегана уже шестое издание вышло, пока только на английском.
0
UFO just landed and posted this here
Не хватает Object-Oriented JavaScript в тему статьи…
0
Почему никто не комментирует пример с Singleton? Этот код можно использовать везде где необходлимо применить паттерн Singleton.
Ведь именно в подобных возможностях и есть основное отличие моего конструктора от множества подобных(если я не прав — киньте ссылку)
Ведь именно в подобных возможностях и есть основное отличие моего конструктора от множества подобных(если я не прав — киньте ссылку)
-1
UFO just landed and posted this here
«new Singleton()» создаёт экземпляр класса Singleton, а мой код создаёт через getInstance экземпляр нужного класса.
SuperDoggy.getInstance() — создаёт экземпляр класса SuperDoggy, а не Singleton.
SuperDoggy.getInstance() — создаёт экземпляр класса SuperDoggy, а не Singleton.
0
Тру-синглтон в JS делается так:
Если нужно наследование, то пишется универсальная функция в три строки, которая позволяет наследовать один объект от другого, вообще безо всяких классов, конструкторов и т.п.
var SingletonName = {
prop1: value,
method1: function() {}
}
Если нужно наследование, то пишется универсальная функция в три строки, которая позволяет наследовать один объект от другого, вообще безо всяких классов, конструкторов и т.п.
+5
а в чём проблема унаследоваться как-то так?
var SingletonName = new Function();
SingletonName.prop1 = value;
SingletonName.method1 = function() {};
var SingletonChild = new SingletonName();
SingletonChild.subMethod = function () {}
0
Это не работает. Свойства должны быть не у функции а у ее прототипа, чтобы наследоваться.
+1
Да, глупость сморозил. Тогда так:
Хотя да — лучше врапнуть в функцию и использовать всегда, когда надо.
var SingletonName = new Function();
SingletonName.prop1 = 123;
SingletonName.method1 = function() {};
var SingletonChild = function () {
var Parent = new Function ();
Parent.prototype = SingletonName;
return new Parent();
}();
SingletonChild.subMethod = function () {}
SingletonChild.method1()
Хотя да — лучше врапнуть в функцию и использовать всегда, когда надо.
0
осуждаю
+1
UFO just landed and posted this here
Смотришь на это, и кажется, что javascript в представлении нифиге не ООП язык только лишь из-за того, что там нет ключевых слов «class», «abstract», «extend».
Согласен! Однако стоит рассматривать мой код как удобную обёртку для тех возможностей языка, которые есть. Подобные конструкторы классов удобно форматируют ваш код. Всё разложено по полочкам, тут методы, тут статические, конструктор, видно что от чего наследуется итд.
Я не пытался максимально приблизиться к ООП. Мой конструктор классов всего лишь собирает класс. Из внутренних свойств добавлен только метод instanceOf
-2
Просто чаще всего программисты привыкли работать лишь с одной версией ООП — той, что реализована в Java/C#. Ну или в С++.
+2
Дополню вашу реализацию переменными инстанса и статичными:
function Clazz(spam){
this.instanceProperty = spam;
}
Clazz.prototype.foo = function(){}
Clazz.staticProperty = 0;
var obj = new Clazz('egg')
function Clazz(spam){
this.instanceProperty = spam;
}
Clazz.prototype.foo = function(){}
Clazz.staticProperty = 0;
var obj = new Clazz('egg')
+1
А мне понравилось. Я не «скульный» javascript программист, на столько глубоко эту тему не знаю. А вашим «велосипедом» буду пользоваться. Если бы мог вам плюс поставить, поставил бы, но не могу :-)
-1
после прочтения пункта
2. Поддержка множественного наследования
сразу вопрос: каков порядок разрешения методов?
2. Поддержка множественного наследования
сразу вопрос: каков порядок разрешения методов?
0
Спасибо, первый вопрос по теме.
Самого по себе разрешения конфликта между методами родительских классов нет.
Если вдруг такая ситуация произойдёт, то можно её решить вручную:
Просто нужно понимать, что полноценной поддержки ООП в JavaScript нет, и тут не стоит строить безумные конструкции в попытке воспроизвести все возможности ООП. Нужно «понять и простить» JavaScript и пользоваться тем, что есть.
Самого по себе разрешения конфликта между методами родительских классов нет.
Если вдруг такая ситуация произойдёт, то можно её решить вручную:
var Dog = createClass({
extend: [Animal, OtherClass],
say: function() {
Animal.fn.say.call(this);
OtherClass.fn.say.call(this);
// ещё какой-то код
}
};
Просто нужно понимать, что полноценной поддержки ООП в JavaScript нет, и тут не стоит строить безумные конструкции в попытке воспроизвести все возможности ООП. Нужно «понять и простить» JavaScript и пользоваться тем, что есть.
0
спасибо — возможный вариант понятен. просто, имхо, именно множественное наследование — «безумные конструкции в попытке воспроизвести все возможности ООП». вот когда стоит вопрос его использования — всегда приходит мысль — плохая архитектура. и его роль сводится к внедрению в текущую иерархию классов и соглашений. своего рода хак.
0
Не стоит зацикливаться на фразе «множественное наследование».
По сути конструкция extend: [Animal, OtherClass] просто копирует свойства обьектов Animal, OtherClass в обьект Dog, а чем они являются (классами, интерфейсами, примесями) это вам решать.
Не любите множественное наследование — не пользуйтесь, просто такая возможность есть и всё.
По сути конструкция extend: [Animal, OtherClass] просто копирует свойства обьектов Animal, OtherClass в обьект Dog, а чем они являются (классами, интерфейсами, примесями) это вам решать.
Не любите множественное наследование — не пользуйтесь, просто такая возможность есть и всё.
0
UFO just landed and posted this here
Юзаю haxe для ООП и не парюсь. А для некоторых задач на чистом js хватает и прототипного наследования.
0
Интересно почему до сих пор придумывают как сделать js похожим на любой другой язык.
js2c++, js2php, js2asm. Здорово что гибкость языка позволяет.
js2c++, js2php, js2asm. Здорово что гибкость языка позволяет.
0
Sign up to leave a comment.
ООП в JavaScript