Pull to refresh

Comments 84

Не нашёл особого сходства. Вы второй пример разбирали?
P.S. И почему все сразу приводят примеры про Animal? :)
В мутулсе точно так же класс создается хешем, некоторые элементы которого являются кейвордами и обозначают наследование (втч множественное), конструкторы, деструкторы итп. Мутулс вообще очень сильно расширяет ООП яваскрипта, которое там, между прочим, есть и без фреймворков.

И Мутулс не один такой, ниже есть потрясающий комментарий.
Немного ИМХО про mootools.

1. Implements во всех языках обозначает, что класс должен реализовывать некий интерфейс, интерфейс — не содержит в себе никакой логики. Мутулс же копирует свойства обьекта, а значит по сути расширяет обьект. Следовательно это Extends, а не Implements (если я всё правильно понял).

2. Вызов родительского класса типа this.parent(age) — лишнее звено. Средствами языка такой вызов делается Animal.call(this, age)

3. initialize — не нравится мне такое название конструктора. Вот почему везде это constructor (construct), а тут initialize?

Правда, создание класса через new Class(...) мне понравилось. Возможно, я тоже так сделаю.
И, конечно, это всё мелочи, на которые можно и не обращать внимания.
И как добавлять в мутулс статические свойства в обьект?
После его создания типа Cat.staticPtop1 = 'sdf'?
При этом new Class теряет целостность.
Я написал свой мутатор Static.
1, 3 — согласен, странно. Может быть они сделали это во избежание совпадения кейвордов в будущем, а может потому, что в яваскрипте прототипное наследование — чтобы не смешивать терминологию. Хотя если честно, мне всегда казалось Init более подходящим для конструктора названием.

2. Зато так мы можем напрямую не указывать в нескольких местах кода от чего унаследован класс. Во большинстве ООПшных языков вызов parent есть, почему бы не добавить это и в жс.
Мне кажется, было-бы лучше примеры кода спрятать под
Эм… По-моему CoffeeScript выглядит лучше. ИМХО конечно же…
По моему CoffeeScript создали по прихоти рубистов и любому javascript прогеру его синтаксис совсем не удобен. Тогда уж я могу сказать «Давайте писать на Dart», или на другом языке транслируемом в js.

Тут же обсуждается именно реализация на следования в js.
Ну так по сути делает тоже самое. И я бы не сказал что синтаксис, который тут предлагают намного удобней CS.
CoffeeScript это скажем так вообще не js, это язык который создан по образу и подобию руби и который транслируется в js.
Если вы пишите на руби то может быть CoffeeScript для вас все, я для себя там ничего удобного не видел. По сути там далеко не тоже самое.

Также замечу тут предлагают не синтаксис а реализацию на javascript, не надо это путать, у Javascript один синтаксис.

Хм… я бы сказал что CS больше похож на Erlang, чем на руби. Вы не поверите но CoffeeScript это тоже реализация на JS.
Что вы вкладываете в эти слова? CoffeeScript — это язык со своим синтаксисом, который при компиляции выдает javascript код. Я об этом писал выше. во что я не должен поверить по вашему?
UFO just landed and posted this here
И почему каждому второму хочется самому реализовать «множественное наследование» в JavaScript? Зачем вам множественное наследование? Оно вам точно надо? В подавляющем большинстве случаев эта задача решается аггрегированием либо использованием mixin, что не уродует иерархию наследования. Посмотрите, как реализовано ООП в YUI3, вам полезнее будет для развития.
Использовать множественное наследование или нет решать разработчику. В Java и Python к примеру оно есть. Предположу, что, как и всегда, его нужно использовать с умом.
С помощью моего конструктора вы можете легко использовать и классы-примеси, помещая их в extend. Так же можно и подобие интерфейса использовать(класс со всеми абстрактными методами).

Код даёт возможность использования тех технологий, которые выберет для себя разработчик.
> В Java

Вы имеете в виду наследование поведения?
Извиняюсь, про Java я прогнал.
Вот нашёл в wiki языки, поддерживающие множественное наследование:
Eiffel, C++, Dylan, Python, Perl
А без вашего конструктора это было недостижимо?
Конструктор createClass никакого нового функционала (кроме метода instanceOf) не навешивает. Естественно это значит, что всё достижимо и на чистом JS. Просто так удобнее.
Каждый программист на 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
Да, если кто-то знает еще реализации — пишите — добавим в коллекцию.
Мой самопал: bitbucket.org/xexsus/js-class/src
Может не самое мощное решение, но зато простейшее, и на практике отлично себя зарекомендовало.
И ещё нативный Object.create
UFO just landed and posted this here
Евгений — Вы все никак не уйметесь…
UFO just landed and posted this here
Судя по количеству ссылок она актуальная:)
Я так понял, если в ваших любимых книжках не написали, что идея ахуенная, то вы смело заявляете что идея говно. У Вас Евгений вообще есть собственное мнение?
Значит я всё сделал правильно Ж8-)
Очень странно, уже довольно давно пишу на клиентском JS и ни разу мне не приходила в голову идея написать свою (или даже взять чужую) реализацию ООП. Не то чтобы необходимость в этом полностью отсутствует, но интерфейсы относительно легко пишутся и нативными средствами (хотя обычно я использую фреймворк).

Получается, что ООП в JS для меня как инструмент с узким кругом задач под него.
> Получается, что ООП в JS для меня как инструмент с узким кругом задач под него.
Да, обычно это имеет смысл лишь при написании крупных фреймворков, например при создании GUI фреймворка вроде ExtJS.
В том то и дело, я сам автор одного GUI-фреймворка, но за полтора года работы над ним, так и не смог понять зачем кому-то переносить ООП в JS «как есть». Единственная причина, это пожалуй, возможность использовать одну и ту же (или опять таки «похожую») архитектуру на клиенте и сервере.
Ну, концепция виртуальных методов, например, на мой взгляд весьма практична при построении иерархии компонент в GUI.
все-таки чего-то не хватает.
пойду писать свою.
не «ООП» — а AOP, извините :)
какой полезный списочек, в мемо :)
Совсем забыли описать тонкости документирования(jsdoc) классов создаваемых через фабрики.
Ребята вот подборка книг хорошая:
— 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к+ гарантирую.
Нужно читать правильных авторов.
У Флэнегана уже шестое издание вышло, пока только на английском.
Новые главы про HTML 5, ECMAscript 5, структура старых глав переработана, новые примеры и объяснения. Ничего кардинального, но если читать первый раз, то лучше сразу шестое.
UFO just landed and posted this here
Почему никто не комментирует пример с Singleton? Этот код можно использовать везде где необходлимо применить паттерн Singleton.
Ведь именно в подобных возможностях и есть основное отличие моего конструктора от множества подобных(если я не прав — киньте ссылку)
UFO just landed and posted this here
«new Singleton()» создаёт экземпляр класса Singleton, а мой код создаёт через getInstance экземпляр нужного класса.
SuperDoggy.getInstance() — создаёт экземпляр класса SuperDoggy, а не Singleton.
Тру-синглтон в JS делается так:
var SingletonName = {
prop1: value,
method1: function() {}
}


Если нужно наследование, то пишется универсальная функция в три строки, которая позволяет наследовать один объект от другого, вообще безо всяких классов, конструкторов и т.п.
а в чём проблема унаследоваться как-то так?

var SingletonName = new Function();

SingletonName.prop1 = value;
SingletonName.method1 = function() {};

var SingletonChild = new SingletonName();
SingletonChild.subMethod = function () {}
Это не работает. Свойства должны быть не у функции а у ее прототипа, чтобы наследоваться.
Да, глупость сморозил. Тогда так:
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()


Хотя да — лучше врапнуть в функцию и использовать всегда, когда надо.
> Хотя да — лучше врапнуть в функцию и использовать всегда, когда надо.

Да, вот именно про это я и писал. Тем более что область применения этой функции из трех строк шире, чем просто создание синглтонов-наследников.
UFO just landed and posted this here
UFO just landed and posted this here
Смотришь на это, и кажется, что javascript в представлении нифиге не ООП язык только лишь из-за того, что там нет ключевых слов «class», «abstract», «extend».


Согласен! Однако стоит рассматривать мой код как удобную обёртку для тех возможностей языка, которые есть. Подобные конструкторы классов удобно форматируют ваш код. Всё разложено по полочкам, тут методы, тут статические, конструктор, видно что от чего наследуется итд.

Я не пытался максимально приблизиться к ООП. Мой конструктор классов всего лишь собирает класс. Из внутренних свойств добавлен только метод instanceOf
UFO just landed and posted this here
Просто чаще всего программисты привыкли работать лишь с одной версией ООП — той, что реализована в Java/C#. Ну или в С++.
Дополню вашу реализацию переменными инстанса и статичными:

function Clazz(spam){
this.instanceProperty = spam;
}

Clazz.prototype.foo = function(){}
Clazz.staticProperty = 0;

var obj = new Clazz('egg')
А мне понравилось. Я не «скульный» javascript программист, на столько глубоко эту тему не знаю. А вашим «велосипедом» буду пользоваться. Если бы мог вам плюс поставить, поставил бы, но не могу :-)
Спасибо за ваш позитивный комментарий!
Судя по количеству плюсов у статьи и количеству закладок она написана не зря.
после прочтения пункта
2. Поддержка множественного наследования

сразу вопрос: каков порядок разрешения методов?
Спасибо, первый вопрос по теме.
Самого по себе разрешения конфликта между методами родительских классов нет.
Если вдруг такая ситуация произойдёт, то можно её решить вручную:

var Dog = createClass({
    extend: [Animal, OtherClass],
    say: function() {
        Animal.fn.say.call(this);
        OtherClass.fn.say.call(this);
        // ещё какой-то код
    }
};

Просто нужно понимать, что полноценной поддержки ООП в JavaScript нет, и тут не стоит строить безумные конструкции в попытке воспроизвести все возможности ООП. Нужно «понять и простить» JavaScript и пользоваться тем, что есть.

спасибо — возможный вариант понятен. просто, имхо, именно множественное наследование — «безумные конструкции в попытке воспроизвести все возможности ООП». вот когда стоит вопрос его использования — всегда приходит мысль — плохая архитектура. и его роль сводится к внедрению в текущую иерархию классов и соглашений. своего рода хак.
Не стоит зацикливаться на фразе «множественное наследование».
По сути конструкция extend: [Animal, OtherClass] просто копирует свойства обьектов Animal, OtherClass в обьект Dog, а чем они являются (классами, интерфейсами, примесями) это вам решать.
Не любите множественное наследование — не пользуйтесь, просто такая возможность есть и всё.
UFO just landed and posted this here
Юзаю haxe для ООП и не парюсь. А для некоторых задач на чистом js хватает и прототипного наследования.
Интересно почему до сих пор придумывают как сделать js похожим на любой другой язык.
js2c++, js2php, js2asm. Здорово что гибкость языка позволяет.
Sign up to leave a comment.

Articles