Стандартный способ, самый простой и понятный.
var clssX = function() {
alert(this.text); // show "Text"
};
clssX.prototype.text = 'Text';
var objX = new clssX();
мой конструктор класса.
var rr = {
new_class: function() {
var oc = Object.prototype.constructor;
function cn(){}; // null constructor
function clss(c) {
return function(a1,a2,a3) {
var x = c.parent, l, m, u;
if (typeof x === 'function') {
x.apply(this, arguments);
};
if (c.factory) {
switch(l = arguments.length){ // for fast
case 0: x = c.factory(this); break;
case 1: x = c.factory(this, a1); break;
case 2: x = c.factory(this, a1, a2); break;
case 3: x = c.factory(this, a1, a2, a3); break;
default:
for(m = [this]; x = l--;) m[x] = arguments[l];
x = c.factory.apply(c, m);
};
if (x !== u) return x;
};
}
};
return function(c) {
if (c) {
var p = c.parent, i, s, u;
if (p = p && p.prototype) {
cn.prototype = p;
p = new cn;
if (s = c.prototype) {
for(i in s) if (s[i] !== u) p[i] = s[i];
c.prototype = p;
};
};
s = c.constructor;
if (!s || s === oc) s = clss(c);
if (p = c.prototype) s.prototype = p;
if (i = c.interface) s.prototype[i === true ? 'interface' : i] = c;
s.interface = c;
return s;
}
}
}(),
newTemplate: function() {
var c = function(){}, cp = c.prototype, ie=!(function(i) {for(i in {constructor:1}) return 1})(), s = !{}.__proto__;
return function(p) {
c.prototype = p || cp;
var x = new c, l = arguments.length, i = 1, n, e;
if (!s) {x.__proto__ = p; c.prototype = x; x = new c};
while(i < l) {
if (e = arguments[i++]) {
for (n in e)
if (e.hasOwnProperty(n))
c[n] = e[n];
if (ie && e.hasOwnProperty(n = 'constructor'))
c[n] = e[n];
};
};
return x;
}
}()
};
пример как использую:
var clssA = rr.new_class({
constructor: function() {
alert(this.text); // show "Text"
},
prototype: {
text: 'Text'
}
});
var clssB = rr.new_class({
parent: clssA,
constructor: function() {
alert(this.text+': '+this.value); //show "Text: bla bla bla"
},
prototype: {
value: 'bla bla bla'
}
});
var clssC = rr.new_class({
factory: function(obj) {
alert(obj.A + this.B); // show (20)
},
prototype: {
A: 12
},
B: 8
});
var clssD = rr.new_class({
parent: clssA,
factory: function(obj) {
alert(obj.text +": "+obj.X); // show "Text: eeeeee ee ee"
},
prototype: {
X: "eeeeee ee ee"
}
});
var itE, clssE = rr.new_class(itE = {
interface: true,
constructor: function() {
alert(this.interface.value); // show "test"
},
value: 'test'
});
var clssF = rr.new_class(itE = {
interface: 'obj_config',
constructor: function() {
alert(this.obj_config.value); // show "test"
},
value: 'test'
});
var objA = new clssA(); // show "Text"
var objB = new clssB(); //show "Text: bla bla bla"
var objD = new clssC(); //show "Text" and show "Text: eeeeee ee ee"
alert(clssE.interface == itE); // show true
иногда нужно сразу создать обьект у которого определенный протатип:
var objN = rr.newTemplate(prot, {
AAA: 1,
BB: 2
});