Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Inspiration:
— Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright © 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)Так что MooTools можно и не выделять — оно основано на реализованном в base2
Язык, как средство выражения мыслей, и мышление, как процесс производства мыслей, теснейшим образом взаимосвязаны и взаимообусловлены. Взаимозависимость языка и мышления проявляется, упрощенно говоря, в том, что мысли отливаются в формы, удобные для их выражения средствами языка, а язык устроен таким образом, чтобы наиболее адекватно отражать сформировавшиеся мысли.Короче говоря, я хочу называть эту надстройку «реализацией классов», потому что мне удобно «думать классами» =)
class A: pass
a = A()
# видим, что и класс "А" и инстанс "а" присутствуют в глобальном объекте
print globals() # вернет объект, где свойства - все глобальные переменные
# расширим класс через инстанс
a.__class__.b = 10
print a.b # 10
# а теперь класс "тихо издыхает"
del globals()['A']
# проверим
print globals() # "A" - исчез
# однако, ествественно, не исчез сам объект класса
print a.__class__ # <class __main__.A at 0x00E243F0>
# т.е. исчезла *лишь ссылка на объект-класс*
# аналогия с JS - конструктор издох (который в
# этом плане служил ссылкой на прототип),
# но объект-инстанс имеет связь с классом
a.__class__.c = 20
a.c # 20
А вот создать новый инстанс класса "А" уже не получится (ссылки нет):
b = A() # .error
JavaScript в данный момент полностью занимает нишу браузерных языков. Несмотря на то, что по слухам некоторые разработчики браузеров встраивают (или уже встроили) в дополнение к JavaScript-у такой язык как Python, для динамического изменения веб-страниц на стороне клиента, официальной информации по этому вопросу нет.
Поэтому, я думаю, сложностей не будет.Сложности — только организационные. Если будет задача (например, «админка на питоне в виде расширения к FF =)»- всё будет интересно и просто; не будет задачи — будет всё наоборот
да ну не о стандартах я говорюя имел ввиду «стандарт-дефакто», а не w3c какой-нибудь )
А вот что будет — посмотрим =)+1: Посмотрим =) Это же самое, кстати, и про майкрософт можно сказать:
var Class = function(){};
Class.create = function(prop, cls_super){
if (!cls_super){
cls_super = Class;
}
var init = false;
// new class
var cls = function (){
if (init) {
// super
this.super = function (name) {
return this.constructor.super(this, name);
}
// extend this
this.extend = function (prop) {
for (name in prop) {
this[name] = prop[name];
}
return this;
}
if (this.init) {
this.init.apply(this, arguments);
}
}
};
cls.prototype = new cls_super();
init = true;
// extend class
for (name in prop) {
cls.prototype[name] = prop[name];
}
cls.prototype.constructor = cls;
// super
cls.super = function(instance, name){
var property = cls_super.prototype[name];
if (property instanceof Function){
return function () {property.apply(instance, arguments)};
} else {
return property;
}
}
// extend
cls.extend = function(prop){
init = false;
var _cls = Class.create(prop, cls);
init = true;
return _cls;
}
return cls;
}
//
// end
//
var Animal = Class.create({init: function(kind){this.kind = kind;}})
var Dog = Animal.extend({
init: function(name, kind) {
this.super('init')(kind);
this.name = name;
}
});
var doggy = new Dog('Rex', 'wolf');
var C1 = Class.create({ init: function() { alert("C1"); } });
var C2 = C1.extend({
init: function() {
alert("C2");
// debugger;
this.super('init')();
}
});
var C3 = C2.extend({ });
var C4 = C3.extend({
init: function() {
alert("C4");
this.super('init')();
}
});
var obj = new C4();
* This source code was highlighted with Source Code Highlighter.Ожидается, что выскочит 3 алерта: С4, С2, С1. А на самом деле работа скрипта закончится ошибкой «too much recursion» =(
// super
this.super = function (name) {
return cls.super(this, name);
}
var Class = function(){};
Class.create = function(prop, cls_super){
if (!cls_super){
cls_super = Class;
}
var init = false;
// new class
var cls = function (){
if (init) {
// extend this
this.extend = function (prop) {
for (name in prop) {
this[name] = prop[name];
}
return this;
}
if (this.init) {
this.init.apply(this, arguments);
}
}
};
cls.prototype = new cls_super();
init = true;
// extend class
for (name in prop) {
cls.prototype[name] = prop[name];
}
cls.prototype.constructor = cls;
// super
cls.super = function(instance, name){
var property = cls_super.prototype[name];
if (property instanceof Function){
return function () {return property.apply(instance, arguments)};
} else {
return property;
}
}
// extend
cls.extend = function(prop){
init = false;
var _cls = Class.create(prop, cls);
init = true;
return _cls;
}
return cls;
}
var C1 = Class.create({ init: function() { alert("C1"); } });
var C2 = C1.extend({
init: function() {
alert("C2");
// debugger;
C2.super(this, 'init')();
}
});
var C3 = C2.extend({ });
var C4 = C3.extend({
init: function() {
alert("C4");
C4.super(this, 'init')();
}
});
var obj = new C4();
(function() {
// код
})();… удобны, но не всегда. Так что, имхо, все попытки «открыть только интерфейс работы с данными» превратятся в разработку костылей (я осознаю, что JS-код статьи многие тоже считают костылём =))простой, понятный, эффективный и легко поддерживаемый код.Это такой код, к виду которого привыкло большинство или разработчик… Да и нет для JS критериев «понятности», «простоты» и «удобства»! Такой уж язык.
рефакторить код с «иерархией классов» довольно сложноРефакторить сложно только «мегобайты кода». Мне кажется это не про JS (точнее — это не про околосайтовые задачи).
Часто инкапсуляция может быть достигнута простейшими организационными мерами: Знание того, что «вот так-то делать нельзя» иногда является самым эффективным средством инкапсуляции!
function Q (){};
Q.prototype.q = 10;
var q = new Q();
alert(q.q); // 10 - посредством делегирования
alert(q instanceof Q); // true
// обnullяем прототип
Q.prototype = null;
// за счет неявной цепи все имеем связь с прототипным объектом
alert(q.q);
// но вот instanceof уже не может достучаться до
// прототипного объекта через ссылку Q.prototype
alert(q instanceof Q); // .error
* This source code was highlighted with Source Code Highlighter.класс МояПримесь: функция проверить(): @a > 10 ? ложь : истина
класс МойКласс: включить: МояПримесь инициализация: @a = 10
Traits are similar to mixins, but may include definitions for class methods.
Traits bear a superficial resemblance to mixins, with several important differences. Several traits can be
applied to a class in a single operation, whereas mixins must be applied one at a time. Trait composition is
unordered, thus avoiding problems due to linearization of mixins. Traits contain methods, but no state, so state
conflicts are avoided, but method conflicts may exist. A class is specified by composing a superclass with a
set of traits and some glue methods. Glue methods are defined in the class and they connect the traits together;
i.e., they implement required trait methods (possibly by accessing state), they adapt provided trait methods, and
they resolve method conflicts.
Traits have the following properties.
– A trait provides a set of methods that implement behaviour.
– A trait requires a set of methods that serve as parameters for the provided behaviour.
– Traits do not specify any state variables, and the methods provided by traits never access state variables directly.
– Classes and traits can be composed from other traits, but the composition order is irrelevant. Conflicting methods must be explicitly resolved.
– Trait composition does not affect the semantics of a class: the meaning of the class is the same as it would be if all of the methods obtained from the trait(s) were defined directly in the class.
– Similarly, trait composition does not affect the semantics of a trait: a composite trait is equivalent to a flattened trait containing the same methods.
Классы в Javascript: вызов методов родительского класса