kidar2,
sysif,
Решает ли этот код проблему отсутствия интерфейсов?
Источник -
Посоветуйте маленькую ооп библиотеку
Object.mixin = function(dst /*, arg1, arg2... */)
{
for (var i = 1; i < arguments.length; i++) {
for (var prop in arguments[i]) {
if ( arguments[i].hasOwnProperty(prop) ) {
dst[prop] = arguments[i][prop];
}
}
}
return dst;
}
Function.prototype.inherit = function(proto)
{
var that = this;
proto = proto || {};
var constructor = proto.hasOwnProperty('constructor') ? proto.constructor : function() { that.apply(this, arguments); };
var F = function() {};
F.prototype = this.prototype;
// Оригинальная строка источника
//constructor.prototype = mixin(new F(), proto);
var dst = Object.mixin(new F(), proto);
for (var i = 1; i < arguments.length; i++) {
if ( ! arguments[i] ) {
continue;
}
for (var p in arguments[i].prototype) {
if ( ! arguments[i].prototype.hasOwnProperty(p) ) {
continue;
}
if ( typeof arguments[i].prototype[p] == 'function' && typeof dst[p] != 'function' ) {
throw new ReferenceError('"' + p + '" method is not implemented');
}
}
}
constructor.prototype = dst;
constructor.superclass = this.prototype;
constructor.prototype.constructor = constructor;
return constructor;
};
// Глобальный интерфейс - родитель всех остальных интерфейсов
var Interface = Object.inherit({
constructor: function()
{
throw new ReferenceError('An object could not be instantiated from an interface');
}
});
// Интерфейс - Перемещаемые объекты
var IMovable = Interface.inherit({
move: function() {}
});
// интерфейс - Рисуемые объекты
var IDrawable = Interface.inherit({
draw: function() {}
});
// Класс Точка
// реализует интерфейсы Перемещаемые, Рисуемые
// но не реализует все методы интерфейсов
// поэтому будет брошено исключение
var Point = Object.inherit({
constructor: function(x, y)
{
this.x = x;
this.y = y;
},
draw: function()
{
alert('Point at [' + this.x + ', ' + this.y + ']');
}
}, IMovable, IDrawable);
// Этот код не будет выполнен пока
// 1. не будет реализован метод "move" или
// 2. не будет исключен интерфейс Перемещаемые из цепочки наследования
var obj = new Point(1, 1);
obj.draw();