@ange007
Программист, просто программист.

Наследование в 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[].
Как быть?
  • Вопрос задан
  • 3710 просмотров
Решения вопроса 1
Как раз в ExtJS у каждого класса есть метод callParent. Этот метод основывается на свойстве объекта функции caller. Таким образом callParent узнает какой метод нужно вызвать относительно родительского класса.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
romanzhak
@romanzhak
Mathematician
Сначала нужно js подучить, чтоб такие вещи делать :)
Например, коллекцию arguments нужно брать из объекта активации и приводить к Array:

var fn = function( name ) {
  var sliced = Array.prototype.slice
    , args   = sliced.call( arguments, 1 );

Object.prototype.toString.call( args ); // => [object Array] 
}
Ответ написан
KEKSOV
@KEKSOV
Думаю, что здесь вы найдете несколько ответов на свой вопрос. Еще можно подглядеть, как это сделано в Ext.extend
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы