Если вы ищете простую легковесную библиотеку, которая дает вам именно это: ООП "сделано правильно" в javascript, посмотрите на это: https://github.com/haroldiedema/joii
Примеры исходного кода, предоставленные в файле readme настраница github, а также следующие ссылки:
Эта библиотека в основном позволяет определять «классы»в таком виде:
var Person = Class(function() {
this.firstname = "John"
this.surname = "Smith"
this.role= "Developer"
this.getInfo = function() {
return this.firstname + ' ' + this.surname + ' is ' + this.role;
};
});
var AnotherPerson = Class({ extends: Person }, function() {
this.firstname = "Bob";
});
var p = new AnotherPerson();
console.log(p.getInfo());
// Bob Smith is Developer
Редактировать
Если взять в качестве примера ваш код, но преобразованный в JOII-совместимый код, он будет выглядеть именно так:
var obj_name = Class(function() {
this.foo = function() { alert('hi!'); };
this.foo2 = function() { alert('hi again!'); };
};
var obj_name2 = Class({ extends: obj_name }, function() {
this.newfoo = function() { alert('hi #3'); };
});
var o = new obj_name2();
o.foo(); // hi!
o.newfoo(); // hi #3
Или используйте его как дополнение:
var o = new obj_name();
o.mixin(obj_name2);
o.newfoo(); // hi #3
Или наоборот, используя «черту».
// the "uses" option basically copies content from the given object to the scope of your "class", solving the horizontal code-reuse problem.
var obj_name = Class({ uses: [obj_name2], function() {
this.foo = function() { alert('hi!'); };
this.foo2 = function() { alert('hi again!'); };
});
var o = new obj_name();
o.newfoo(); // hi #3