var util = require('util'); // function ParentClass(par1, par2) { this.parentField1 = par1; this.parentField2 = par2; } function ChildClass(par1, par2) { ChildClass.super_.apply(this, arguments); this.childField1 = par1; this.childField2 = par2; } // util.inherits(ChildClass, ParentClass); // var obj = new ChildClass('Hello', 'World'); console.dir({ obj: obj }); /* : { obj: { parentField1: 'Hello', parentField2: 'World', childField1: 'Hello', childField2: 'World' } } */
var util = require('util'); // function ParentClass(par1, par2) { this.parentField1 = par1; this.parentField2 = par2; } // ParentClass.prototype.parentMethod = function(par) { console.log('parentMethod("' + par + '")'); }; // ParentClass.prototype.parentField = 'Parent field value'; // function ChildClass(par1, par2) { ChildClass.super_.apply(this, arguments); this.childField1 = par1; this.childField2 = par2; } // util.inherits(ChildClass, ParentClass); // ChildClass.prototype.childMethod = function(par) { console.log('childMethod("' + par + '")'); }; // ChildClass.prototype.childField = 'Child field value'; // var parentClassInstance = new ParentClass('Marcus', 'Aurelius'); var childClassInstance = new ChildClass('Yuriy', 'Gagarin'); // console.dir({ parentClassInstance: parentClassInstance, childClassInstance: childClassInstance }); console.dir({ objectFieldDefinedInParent: childClassInstance.parentField1, classFieldDefinedInParent: childClassInstance.parentField, objectFieldDefinedInChild: childClassInstance.childField1, classFieldDefinedInChild: childClassInstance.childField }); parentClassInstance.parentMethod('Cartesius'); childClassInstance.childMethod('von Leibniz'); /* : { parentClassInstance: { parentField1: 'Marcus', parentField2: 'Aurelius' }, childClassInstance: { parentField1: 'Yuriy', parentField2: 'Gagarin', childField1: 'Yuriy', childField2: 'Gagarin' } } { objectFieldDefinedInParent: 'Yuriy', classFieldDefinedInParent: 'Parent field value', objectFieldDefinedInChild: 'Yuriy', classFieldDefinedInChild: 'Child field value' } parentMethod("Cartesius") childMethod("von Leibniz") */
var util = require('util'); // function ParentClass(par1, par2) { this.parentField1 = par1; this.parentField2 = par2; } // ParentClass.prototype.methodName = function(par) { console.log('Parent method implementation: methodName("' + par + '")'); }; // function ChildClass(par1, par2) { ChildClass.super_.apply(this, arguments); this.childField1 = par1; this.childField2 = par2; } // util.inherits(ChildClass, ParentClass); // ChildClass.prototype.methodName = function(par) { // ChildClass.super_.prototype.methodName.apply(this, arguments); // console.log('Child method implementation: methodName("' + par + '")'); }; // var childClassInstance = new ChildClass('Lev', 'Nikolayevich'); // childClassInstance.methodName('Tolstoy'); /* : Parent method implementation: methodName("Tolstoy") Child method implementation: methodName("Tolstoy") */
This construct for calling the parent class method is of course very cumbersome: ClassName.super_.prototype.methodName.apply (this, arguments) but I did not find another way for the native Nodal implementation of inheritance. The only dubious improvement that occurred to me was given in the following example. var util = require('util'); // Function.prototype.override = function(fn) { var superFunction = this; return function() { this.inherited = superFunction; return fn.apply(this, arguments); }; }; // function ParentClass(par1, par2) { this.parentField1 = par1; this.parentField2 = par2; } // ParentClass.prototype.methodName = function(par) { console.log('Parent method implementation: methodName("' + par + '")'); }; // function ChildClass(par1, par2) { ChildClass.super_.apply(this, arguments); this.childField1 = par1; this.childField2 = par2; } // util.inherits(ChildClass, ParentClass); // ChildClass.prototype.methodName = ParentClass.prototype.methodName.override(function(par) { // this.inherited(par); // this.inherited.apply(this, arguments); // console.log('Child method implementation: methodName("' + par + '")'); }); // var childClassInstance = new ChildClass('Lev', 'Nikolayevich'); // childClassInstance.methodName('Tolstoy'); /* : Parent method implementation: methodName("Tolstoy") Child method implementation: methodName("Tolstoy") */
var util = require('util'); // function override(child, fn) { child.prototype[fn.name] = fn; fn.inherited = child.super_.prototype[fn.name]; } // function ParentClass(par1, par2) { this.parentField1 = par1; this.parentField2 = par2; } // ParentClass.prototype.methodName = function(par) { console.log('Parent method implementation: methodName("' + par + '")'); console.dir({t1:this}) this.parentField3 = par; }; // function ChildClass(par1, par2) { ChildClass.super_.call(this, par1, par2); this.childField1 = par1; this.childField2 = par2; } // util.inherits(ChildClass, ParentClass); // override(ChildClass, function methodName(par) { // methodName.inherited.call(this, par); // console.log('Child method implementation: methodName("' + par + '")'); this.childField3 = par; }); // var childClassInstance = new ChildClass('Lev', 'Nikolayevich'); // childClassInstance.methodName('Tolstoy'); /* : Parent method implementation: methodName("Tolstoy") Child method implementation: methodName("Tolstoy") */
Source: https://habr.com/ru/post/247325/
All Articles