Спасибо. Особенно понравилось решение по перезаписи метода, которое я давно искал.
Насчет вашей реализации конструктора - я к сожалению еще не на том уровне, чтобы полностью понимать его, но вопрос - полностью ли корректна такая его реализация:
var Class = function(parent, declaration) {
var $extend = Object.extend = function(self, obj) {
if (self == null) self = {};
for (var key in obj) self[key] = obj[key];
return self;
}
var Klass = function() {
this.initialize.apply(this, arguments);
}
if (typeof parent == 'function') {
function F(){}
F.prototype = parent.prototype;
Klass.prototype = new F();
} else {
if (parent != null) declaration = parent;
parent = Object;
}
$extend(Klass.prototype, declaration).initialize || (Klass.prototype.initialize = Function.blank);
Klass.$super = parent;
Klass.prototype.$super = parent.prototype;
return Klass.prototype.constructor = Klass;
}
var Pa = Class({
initialize: function(color) {
this.populate(color);
},
populate: function(color) {
this.container = div('container', 'empty');
this.container.style.background = color;
}
});
var Ci = Class(Pa, {
populate: function(color) {
P.prototype.populate.call(this, color);
this.header = div('header', 'Заголовок!');
this.container.appendChild(this.header);
}
});
В примере, который мы рассматриваем моя реализация работает корректно, ошибок нее выдает, но не видите ли вы каких-то скрытых подводных граблей?
И еще несколько вопросов:
1) имеет ли какое-то значение использование $ в названиях функций и свойств? Судя по тому что знаю я - значение у доллара чисто символическое, оно для программиста, а не для интерпретатора.
2) для чего нужно $extend = Object.extend = function, что дает наличие Object.extend?
3) Немного смутило свойство Klass.$super. Если это замена .superclass, то как она работает?