// Базовый класс
//
// Create proper-derivable "class".
//
// Version: 1.2
//
function newClass(parent, prop) {
// Dynamically create class constructor.
var clazz = function() {
// Stupid JS need exactly one "operator new" calling for parent
// constructor just after class definition.
if (clazz.preparing) return delete(clazz.preparing);
// Call custom constructor.
if (clazz.constr) {
this.constructor = clazz; // we need it!
clazz.constr.apply(this, arguments);
}
}
clazz.prototype = {}; // no prototype by default
if (parent) {
parent.preparing = true;
clazz.prototype = new parent;
clazz.prototype.constructor = parent;
clazz.constr = parent; // BY DEFAULT - parent constructor
}
if (prop) {
var cname = "constructor";
for (var k in prop) {
if (k != cname) clazz.prototype[k] = prop[k];
}
if (prop[cname] && prop[cname] != Object)
clazz.constr = prop[cname];
}
return clazz;
}
// Наследники >>
// Базовый "класс".
Car = newClass(null, {
constructor: function() {
document.writeln("Вызван конструктор Car().");
},
drive: function() {
document.writeln("Вызван Car.drive()");
}
});
// Производный "класс".
Zaporojets = newClass(Car, {
constructor: function() {
document.writeln("Вызван конструктор Zaporojets().");
this.constructor.prototype.constructor.call(this);
},
crack: function() {
document.writeln("Вызван Zaporojets.crack()");
},
drive: function() {
document.writeln("Вызван Zaporojets.drive()");
return this.constructor.prototype.drive.call(this);
}
});
// Пример использования >>
document.writeln("Программа запущена.");
// Создаем объект производного "класса".
var vehicle = new Zaporojets();
vehicle.drive(); // вызывается функция базового объекта
// Создаем еще один объект того же класса.
var vehicle = new Zaporojets();
vehicle.crack(); // функция производного объекта