Показать сообщение отдельно
  #1 (permalink)  
Старый 29.11.2018, 18:58
_0_ _0_ вне форума
Аспирант
Отправить личное сообщение для _0_ Посмотреть профиль Найти все сообщения от _0_
 
Регистрация: 10.05.2013
Сообщений: 56

Манипуляция с function.__proto__
Добрый вечер,

Прошу мнения знающих людей.

Возникла необходимость написания библиотеки "классов", при этом встал вопрос чрезмерного захламления прототипа, вот и подумал часть функционала перенести в "статическую" область, изменяя прототип конструктора на родительский конструктор.

Вообще-то всё вроде получается, но я такого ещё не встречал.

Вообще, можно так писать? Если нет, то в чем проблема?
Проверил в IE, FF, Opera...

if( true ){
	
	function f1(){}
	
	f1.say = function(){ 
		var n = [], f = this;
		while( f && f.sname ){
			n.push( f.sname );
			f = Object.getPrototypeOf( f );
		}
		alert( 'f1.say ' + n.join(', ') );
	}
	f1.sname = 'f1';
	
	f1.prototype = {
		constructor : f1,
		say : function(){ 
			var n = [], proto = this.constructor.prototype;
			while( proto && proto.constructor && proto.constructor.sname ){
				n.push( proto.constructor.sname );
				proto = Object.getPrototypeOf( proto );
			}
			alert( 'f1.prototype.say ' + n.join(', ') );
		}
	}
	
	function f2(){}
	f2.sname = 'f2';
	Object.setPrototypeOf( f2, f1 );
	f2.prototype = Object.create( f1.prototype, {
		constructor : { value : f2 }
	});
	
	
	function f3(){}
	f3.sname = 'f3';
	Object.setPrototypeOf( f3, f2 );
	f3.prototype = Object.create( f2.prototype, {
		constructor : { value : f3 }
	});
	
	var f = new f3();

	f.say();
	f3.say();
}
Ответить с цитированием