Краткая заметка про наследование в Node.js
- вторник, 6 января 2015 г. в 02:11:29
var util = require('util');
// Определение классов
function ParentClass(par1, par2) {
this.parentField1 = par1;
this.parentField2 = par2;
}
function ChildClass(par1, par2) {
this.constructor.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) {
this.constructor.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) {
this.constructor.super_.apply(this, arguments);
this.childField1 = par1;
this.childField2 = par2;
}
// Наследование
util.inherits(ChildClass, ParentClass);
// Переопределение метода в дочернем классе
ChildClass.prototype.methodName = function(par) {
// Вызов метода родительского класса
this.constructor.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.constructor.super_.prototype.methodName.apply(this, arguments) но другого способа для родной нодовской реализации наследования я не нашел. Единственное, сомнительное улучшение, которое пришло мне в голову приведено в следующем примере.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) {
this.constructor.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(parent, fn) {
fn.inherited = parent.prototype[fn.name];
return function() {
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) {
this.constructor.super_.apply(this, arguments);
this.childField1 = par1;
this.childField2 = par2;
}
// Наследование
util.inherits(ChildClass, ParentClass);
// Переопределение метода в дочернем классе
ChildClass.prototype.methodName = override(ParentClass, function methodName(par) {
// Вызов метода родительского класса
methodName.inherited(par);
// Собственный функционал
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")
*/
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.