начал разбираться здесь
сейчас еще подумал еще на эту тему, и написал пример (он ниже).
там для эмуляции наследования используется только prototype. не используется object.create и прочие новомодные штучки, все "ближе к земле". синтаксис немного упростится, если использовать Object.Create (не понадобились бы функции типа A_Proto).
А еще недавно в JS появился синтаксис объявления классов, более-менее похожий на используемый в объектно-оринентированных языках, с использованием ключевого слова "class". однако, нет поддержки этого синтаксиса, например, в IE 11. то есть, на мой взгляд, использовать это пока рановато.
Аутпут:
***A***
inheritance.html
ConstructorA
inheritance.html
222
inheritance.html
fA
inheritance.html
virtFA: 222; a_param
inheritance.html
***B***
inheritance.html
ConstructorA
inheritance.html
ConstructorB
inheritance.html
223
inheritance.html
777
inheritance.html
fA
inheritance.html
fB
inheritance.html
virtFB: 777; b_param
inheritance.html
virtFA: 223; b_param
inheritance.html
***C***
inheritance.html
ConstructorA
inheritance.html
ConstructorB
inheritance.html
ConstructorC
inheritance.html
457
inheritance.html
123
inheritance.html
fA
inheritance.html
fB
inheritance.html
fC
inheritance.html
123
inheritance.html
virtFC: c_param
inheritance.html
virtFB: 123; c_param
inheritance.html
virtFA: 457; c_param
сейчас еще подумал еще на эту тему, и написал пример (он ниже).
там для эмуляции наследования используется только prototype. не используется object.create и прочие новомодные штучки, все "ближе к земле". синтаксис немного упростится, если использовать Object.Create (не понадобились бы функции типа A_Proto).
А еще недавно в JS появился синтаксис объявления классов, более-менее похожий на используемый в объектно-оринентированных языках, с использованием ключевого слова "class". однако, нет поддержки этого синтаксиса, например, в IE 11. то есть, на мой взгляд, использовать это пока рановато.
var A = function(initPropA, noConstructor){ this.ConstructorA(initPropA); }; var A_Proto = function(){ this.propA = null; //для порядка this.ConstructorA = function(initPropA){ console.log("ConstructorA"); this.propA = initPropA; }; this.fA = function(){ console.log("fA"); }; this.virtF = function(param){ console.log("virtFA: " + this.propA + "; " + param) }; } A.prototype = new A_Proto(); var B = function(initPropB, initpropA){ this.ConstructorB(initPropB, initpropA); } var B_Proto = function(){ this.propB = null; this.ConstructorB = function(initPropB, initpropA){ //конструктор класса-потомка вызывает конструктор предка, а потом производит свою инициализацию this.ConstructorA(initpropA); console.log("ConstructorB"); if (this.propA % 2 == 0) this.propA++; this.propB = initPropB; }; this.fB = function(){ console.log("fB"); }; this.ShowPropB = function(){ console.log(this.propB); } this.virtF = function(param){ console.log("virtFB: " + this.propB+ "; " + param); A.prototype.virtF.call(this, param); //вызов версии метода базового класса }; } B_Proto.prototype = new A_Proto(); B.prototype = new B_Proto(); var C = function(){ this.ConstructorC(); } var C_Proto = function(){ this.ConstructorC = function(){ this.ConstructorB(123, 456); console.log("ConstructorC"); } this.fC = function(){ console.log("fC"); this.ShowPropB(); }; this.virtF = function(param){ console.log("virtFC: " + param); B.prototype.virtF.call(this, param); //вызов версии метода базового класса }; } C_Proto.prototype = new B_Proto(); C.prototype = new C_Proto(); console.log("***A***"); var a = new A(222); console.log(a.propA); a.fA(); a.virtF("a_param"); console.log("***B***"); var b = new B(777, 222); console.log(b.propA); console.log(b.propB); b.fA(); b.fB(); b.virtF("b_param"); console.log("***C***"); var c = new C(); console.log(c.propA); console.log(c.propB); c.fA(); c.fB(); c.fC(); c.virtF("c_param");
***A***
inheritance.html
ConstructorA
inheritance.html
222
inheritance.html
fA
inheritance.html
virtFA: 222; a_param
inheritance.html
***B***
inheritance.html
ConstructorA
inheritance.html
ConstructorB
inheritance.html
223
inheritance.html
777
inheritance.html
fA
inheritance.html
fB
inheritance.html
virtFB: 777; b_param
inheritance.html
virtFA: 223; b_param
inheritance.html
***C***
inheritance.html
ConstructorA
inheritance.html
ConstructorB
inheritance.html
ConstructorC
inheritance.html
457
inheritance.html
123
inheritance.html
fA
inheritance.html
fB
inheritance.html
fC
inheritance.html
123
inheritance.html
virtFC: c_param
inheritance.html
virtFB: 123; c_param
inheritance.html
virtFA: 457; c_param