Наследование в JS. Как сделать удобное обращение к родителю? Есть самописная библиотека для создания и наследования классов.// Создаём заготовку наследника var nClass = function( ) { }; nClass.prototype = parentClass.prototype; // Начинаем наследование childClass.prototype = new nClass( ); childClass.prototype.constructor = childClass; // Оставляем конструктор родителя childClass.prototype.parentConstructor = parentClass; // Вызов функции родителя ( с параметрами ), не указывая префикс childClass.prototype.parentFunction = function( functionName, arguments ) { var arguments = ( arguments instanceof Array ) ? arguments : [ arguments ]; if( this[ prefix + functionName ] instanceof Function ) { return this[ prefix + functionName ].apply( this, arguments ); } else { this.error( 'Функции "' + functionName + '" не существует!' ); } }; Хочу вместо всяких parentFunction и т.д. сделать объект parent из которого можно было бы обращаться уже к функционалу:/* child.parent.name child.parent.scope child.parent.prefix child.parent.constructor child.parent.function( 'name', [ arguments ] ); @return - результат выполнения функции child.parent.parameter( 'name' ); @return - значение переменной/объект/т.д */ childClass.prototype.parent = { name: parentName, // Имя класса родителя scope: parentClass.classScope, // Область видимости родителя prefix: prefix, // Префикс для обращения к функциям родителя constructor: function( arguments ) { var arguments = ( arguments instanceof Array ) ? arguments : [ arguments ];
return parentClass.apply( childClass.prototype, arguments ); }, parameter: function( functionName ) { if( childClass.prototype[ prefix + functionName ] !== undefined ) { return childClass.prototype[ prefix + functionName ]; } }, function: function( functionName, arguments ) { var arguments = ( arguments instanceof Array ) ? arguments : [ arguments ]; if( this[ prefix + functionName ] instanceof Function ) { return this[ prefix + functionName ].apply( this, arguments ); } else { this.error( 'Функции "' + functionName + '" не существует!' ); } } }; Но само собой тут не сработают ни this[], ни всякие childClass.prototype[]. Как быть?
Для обращения к функциям и переменным внутри объекта parent внутри childClass можно использовать анонимную функцию, чтобы сохранить контекст this. Например:
Для обращения к функциям и переменным внутри объекта parent внутри childClass можно использовать анонимную функцию, чтобы сохранить контекст this. Например:
childClass.prototype.parent = {name: parentName,
scope: parentClass.classScope,
prefix: prefix,
constructor: function( arguments ) {
var arguments = ( arguments instanceof Array ) ? arguments : [ arguments ];
return parentClass.apply( this, arguments );
},
parameter: function( functionName ) {
if (this[ prefix + functionName ] !== undefined) {
return this[ prefix + functionName ];
}
},
function: function( functionName, arguments ) {
var arguments = ( arguments instanceof Array ) ? arguments : [ arguments ];
if (this[ prefix + functionName ] instanceof Function) {
return this[ prefix + functionName ].apply( this, arguments );
} else {
this.error( 'Функции "' + functionName + '" не существует!' );
}
}.bind(childClass.prototype) // Привязываем контекст к childClass.prototype
};
Таким образом, при вызове child.parent.function('someFunction', [args]) контекст будет указывать на childClass.prototype.