Наследование в 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[].
Как быть?

21 Авг 2019 в 07:09
197 +1
0
Ответы
1

Для обращения к функциям и переменным внутри объекта 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.

20 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 493 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир