Какая библиотека JavaScript имеет наиболее полную поддержку наследования классов?

Поиграв с дюжиной различных библиотек JavaScript, таких как Prototype, jQuery, YUI, и это лишь некоторые из них, я обнаружил, что каждая отдельная библиотека имеет свой способ имитации той или иной иерархии классов и обеспечивает некоторую поддержку наследования классов. (Кроме jQuery) Кроме того, что вас очень раздражает, что когда вы создаете новый класс, он должен зависеть от библиотеки, если вы не делаете простой старый способ.

Мне интересно, какая библиотека предлагает наилучшую поддержку наследования классов в целом и почему.

Я надеюсь, что однажды авторы библиотек JavaScript смогут договориться об одном стиле для создания и наследования классов.


person Aaron Qian    schedule 02.04.2009    source источник
comment
Этот вопрос относится к той же теме: stackoverflow.com/questions/7486825/javascript-inheritance   -  person Anderson Green    schedule 24.02.2013
comment
Уилл, тебе следует перестать закрывать такие вопросы. Этот вопрос вполне конструктивен. Вы ведете себя деструктивно, закрывая этот вопрос. Спасибо за ничего.   -  person B T    schedule 18.07.2013
comment
ExtJS имеет чрезвычайно полную систему классов   -  person Oliver Watkins    schedule 14.07.2016


Ответы (9)


Я узнал, что существует Javascript Framework, созданный по образцу Ruby:

Js.Class

Еще один хороший:

Joose-js (по образцу лося (perl) )

Я предпочитаю Josse, потому что он более активно разрабатывается, да и синтаксис выглядит аккуратно!

Есть предположения??? (Может быть, это должен быть другой вопрос??)

person Aaron Qian    schedule 03.04.2009
comment
Извините, я бессовестно отметил себя как предпочтительный ответ! - person Aaron Qian; 30.08.2009
comment
Отменил себя как предпочтительный ответ. Правда в том, что на этот вопрос нет правильного ответа. - person Aaron Qian; 22.11.2015

Я думаю, что Microsoft Ajax реализует это просто идеально (с пространствами имен, наследованием и интерфейсами). и т.д.)

Образец:

Type.registerNamespace("Demo");

Demo.Person = function(firstName, lastName, emailAddress) {
    this._firstName = firstName;
    this._lastName = lastName;
    this._emailAddress = emailAddress;
}

Demo.Person.prototype = {

    getFirstName: function() {
        return this._firstName;
    },

    getLastName: function() {
        return this._lastName;
    },

    getName: function() {
        return this._firstName + ' ' + this._lastName;
    },

    dispose: function() {
        alert('bye ' + this.getName());
    }
}
Demo.Person.registerClass('Demo.Person', null, Sys.IDisposable);

// Notify ScriptManager that this is the end of the script.
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
person Konstantin Tarkus    schedule 02.04.2009
comment
Документы: msdn.microsoft.com/en-us /библиотека/bb310848(v=vs.100).aspx - person B T; 18.07.2013

Вы должны попробовать классный:

http://classy.pocoo.org/

Он простой и очень маленький, но в нем есть все, что мне нужно для создания моих классов.

person sickill    schedule 27.07.2010

Ознакомьтесь с Prototype. Вот пример:

// properties are directly passed to `create` method
var Person = Class.create({
  initialize: function(name) {
    this.name = name;
  },
  say: function(message) {
    return this.name + ': ' + message;
  }
});

// when subclassing, specify the class you want to inherit from
var Pirate = Class.create(Person, {
  // redefine the speak method
  say: function($super, message) {
    return $super(message) + ', yarr!';
  }
});

var john = new Pirate('Long John');
john.say('ahoy matey');
// -> "Long John: ahoy matey, yarr!"
person Andreas Grech    schedule 02.04.2009

Base2 имеет простой механизм наследования , см. пост об этом (комментарии в посте тоже интересны).

Следует также иметь в виду, что попытки имитировать классический объектно-ориентированный подход в Javascript в последнее время вызывают много критики (хотя в первые дни великой революции JS-библиотек этот вопрос исследовался с большим энтузиазмом).

person Surya    schedule 02.04.2009
comment
есть ссылка на второй абзац? Спасибо! - person Aaron Qian; 03.04.2009
comment
javascript.crockford.com/inheritance.html , вывод в статье кажется интересным .. не могу найти Презентация Крокфорда по этому вопросу. - person Surya; 03.04.2009
comment
Хотя я согласен с Крокфордом в том, что прототипирование Javascript является более мощным, чем статическое наследование (или, по крайней мере, столь же полезным), его доказательство состоит в том, что он изобрел новые термины (привилегированные методы, паразитическое наследование и т. д.), а затем показал, что вы можете сделать с большим количеством каркас, относящийся к синтаксическому сахару. Что для меня не доказательство, просто еще одна структура наследования, которая не очень хорошо работает. - person Guss; 10.09.2009
comment
+1: если вам нужен независимый от библиотеки метод, научитесь делать это без абстракции различных библиотек. Это не особенно сложно, как только вы пройдете его несколько раз, и вы получите более тонкий уровень контроля. Но точка зрения Крокфорда шире: через некоторое время вы начинаете обнаруживать, что иерархия классов не всегда является самым удобным способом моделирования предметной области. - person Weston C; 28.07.2010
comment
Javascript Patterns by Stoyan Stefanov предлагает более высокий уровень представления о конструкциях прототипов/замыканий и может дать представление о том, как jQuery, YUI и подобные им реализуют их. Я рекомендую прочитать его после The Good Parts (и до High Performance Javascript). Он похож по размеру, и O'Reilly продает его за копейки на Android Market. - person Marco Mariani; 11.09.2011

Вас также может заинтересовать qooxdoo — фреймворк для создания многофункциональных интернет-приложений (RIA). Он включает в себя комплексный объектно-ориентированный уровень, цель которого — быть мощным, элегантным и быстрым:

См. следующий раздел руководства, в котором есть все подробности: http://qooxdoo.org/documentation/0.8#object_orientation

person Andreas Ecker    schedule 20.07.2009

Я считаю mootools всем, что мне нужно для наследования. Он использует основной мотив расширений и реализаций многих других ОО-языков.

Один из разработчиков подробно описывает это в своем сравнении с jquery:

http://jqueryvsmootools.com

Вам также не нужна вся библиотека. Вы можете просто загрузить их модель класса и игнорировать все остальное (анимацию, манипулирование домом и т. д.).

person Ryan Florence    schedule 20.07.2009

Просто выберите то, что вам «вкуснее». В конце концов, все они за кулисами используют прототипное наследование, поэтому все они имеют примерно одинаковый уровень функциональности.

Если вам нужна мощная традиционная система классов, используйте GWT и программируйте на чистой Java.

Лично я предпочитаю компонентную систему Ext, но это потому, что компоненты Ext на самом деле имеют полный жизненный цикл ( инициализация, рендеринг, сохранение состояния и уничтожение), что, в свою очередь, позволяет использовать подключаемые модули компонентов, которые не ломаются при незначительных обновлениях библиотеки.

person Joeri Sebrechts    schedule 27.07.2010
comment
да. Ext был хорошим, и моя компания использовала его в проекте, используемом в FIFA 2010. В итоге мы построили фреймворк поверх Ext, это было довольно интересно. Однако я предпочитаю joose-js, так как он имеет гораздо больше возможностей, чем система классов Ext. :) - person Aaron Qian; 30.07.2010

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

DUI (библиотека пользовательского интерфейса Digg) — это надстройка jQuery, которая берет старую модель Prototype и расширяет ее гораздо более интуитивно понятным образом, позволяя использовать вложенные статические и динамические классы, пространства имен, поддержку бита dontEnum и многое другое. Документация доступна на GitHub Digg. Я думаю, вы найдете его довольно прочным.

Раскрытие информации: я работаю на Digg и написал DUI ;)

person Micah Snyder    schedule 03.04.2009