Можно сделать через примеси и шаблон "поведение".
// Реализует наследование
function inherit(proto) {
function F() {}
F.prototype = proto;
var object = new F;
return object;
}
//Реализует примеси
function mixin(dest, src) {
var field, tempObj = {};
for (field in src) {
if (typeof(tempObj[field]) == undefined || (tempObj[field] != src[field])) {
dest[field] = src[field];
}
}
}
/* Behaviors */
//Поведение позволяет осуществить примешивание к целевому классу новых методов и свойств.
// приватные свойства
behavior = function(targetObj, name) {
this.name = name;
this.owner = targetObj;
};
behavior.prototype = {
"mixin": function(dest, src) {
var field, systemNames = ['setOwner', 'getOwner', 'apply'],
tempObj = {};
for (field in src) {
if (
(typeof(tempObj[field]) == undefined || (tempObj[field] != src[field]))
&& systemNames.indexOf(src[field]) === -1) {
dest[field] = src[field];
}
}
},
"setOwner": function(owner) {
this.Class = this.constructor.name;
this.owner = owner;
if (this.apply) {
this.apply();
}
mixin(this.owner, this);
},
"getOwner": function() {
return owner;
},
"apply": function() {
this.mixin(this.owner, this);
}
};
applyToBehavior = function() {};
applyToBehavior.prototype = inherit(behavior.prototype);
applyToBehavior.prototype.applyTo = function(targetObj, methodName, param) {
if (targetObj && this[methodName]) {
this[methodName].call(targetObj, param);
}
};