Всем снова привет!
Сегодня влил новую стабильную версию библиотеки. В новой версии были внесены некоторые изменения и нововведения.
Что нового?
1. Была переработана система наследования, теперь множественное наследование это, все равно что обычное наследование.
2. Была введена отдельная инкапсуляция для аксессоров.
3. Теперь конструкторы можно называть именем класса.
Что изменилось?
1. Теперь контекст классов по умолчанию всегда глобальный.
1. Теперь при обращении к аксессору не имеющего getter'а срабатывает исключение, то же самое и с setter'ом.
Эти добавления и изменения заставили переписать систему построения наследования почти с нуля. Так же это сказалось на оптимизации, скорость построения классов увеличилась, размер кода остался почти без изменений (то есть мне удалось внести нововведения и изменения без огромного увеличения размера библиотеки).
Примеры:- Множественное наследование
/**
* @class Foo
*/
Class("Foo", {
/**
* @constructor
* @constructs
*/
Foo: function() {
alert("Executed constructor: " + this.__class__.className);
}
});
/**
* @class Bar
* @extends Foo
*/
Class("Bar", "Foo", { // наследуем от Foo
/**
* @constructor
* @constructs
*/
Bar: function() {
this.parent.constructor();
alert("Executed constructor: " + this.__class__.className);
}
});
/**
* @class Biz
*/
Class("Biz", {
/**
* @constructor
* @constructs
*/
Biz: function() {
alert("Executed constructor: " + this.__class__.className);
}
});
/**
* @class Baz
* @extends Biz
*/
Class("Baz", "Biz", {
/**
* @constructor
* @constructs
*/
Baz: function() {
this.parent.constructor();
alert("Executed constructor: " + this.__class__.className);
}
});
/**
* @class Mix
* @extends Bar
* @implements Baz
*/
Class("Mix", "Bar, Baz", {
/**
* @constructor
* @constructs
*/
Mix: function() {
this.parent.constructor();
alert("Executed constructor: " + this.__class__.className);
// вызываем коструктор класса указанного в параметре implements
this.Baz();
}
});
var obj = new Mix(); // alerts Foo, Bar, Mix, Biz, Baz
Структура в отладчике:
- отдельная инкапсуляция для аксессоров
/**
* @class Foo
*/
Class("Foo", {
/**
* @type {String}
* @property
* @public
*/
name: {
// инкапсуляция
value: "DefaultValue", // снаружи нет доступа к этому значению
set: function(value, self) { // self это ссылка на объект свойства name
self.value = value;
},
get: function(self) {
return self.value;
}
}
});
var obj = new Foo();
alert(obj.name); // alerts "DefaultValue"
obj.name = "NewValue"; // executed setter
alert(obj.name); // alerts "NewValue"
- конструкторы можно называть именем класса.
Это вы уже увидели из примеров выше
Основную документацию вы найдете в первом топике этой темы.
На любые вопросы с большим удовольствием отвечу. Пожелания, выслушаю. Всем спасибо!
Скачать как всегда тут:
https://github.com/devote/jsClasses