Показать сообщение отдельно
  #1 (permalink)  
Старый 11.08.2009, 10:37
zzz zzz вне форума
Аспирант
Отправить личное сообщение для zzz Посмотреть профиль Найти все сообщения от zzz
 
Регистрация: 06.08.2009
Сообщений: 91

JavaScript Классическое наследование
Этот день настал... Впервые за 2 месяца обучения я вижу код на JavaScript который не понял после тщательного разбора каждой строки, не понял вообще как он работает. Это функции созданные для имитации классического наследования. Что такое классическое наследование я вроде знаю их PhP это когда создатся класс и обьекты созданые этим классом наследуют его свойства и методы.
Вот код, сообщения типо код отстойный надо поправить (хотя вратли так кто-нибудь скажет ведь это код самого Дугласа Крокфорда (сообщение чё эт за тип тоже не писать)) постить не надо. Даже если есть код в 100 раз легче но с таким же результатом мне пофиг. Так как мне надо именно разобратся в этом коду.
//Простой вспомогательный метод, метод позволяющий привязать новую функцию к прототипу обьекта
Function.prototype.method = function(name, func) {
	this.prototype[name]=func;
	return this;
	};
//Довольно сложная функция, позволяющая весьма изящно наследовать функции обьектов и сохранять возможность вызова функции "родительского окнаЭ обьекта
Function.method("inherits", function(parent) {
	//Отслеживание, на каком уровне глубины в родительских функциях мы находимся
	var depth=0;
	var proto = this.parent = new parent();
	//Создание новой "привилегированной" функции под названием "uber", которая при вызове выполняет любую функцию вписанную в наследование
	this.method("uber", function uber(name) {
		var func;//Исполняемая функция
		var ret;//Возвращение значения функции
		var v = parent.prototype;//родительский прототип
		//Если мы уже находимся внутри другой функции "uber"
		if(depth){
		    //Спуск на необходимую глубину для поиска исходного прототипа
			for(var i=d; i > 0; i+= 1) {
				v = v.constructor.prototype;
				}
				//И получение функции из прототипа
	        func=v[name];
	        //А если это первый вызов "uber"
	     } else {
	     //Переход вместо этого к родительскому прототипу
	        func=proto[name];     
	        //Если функция была частью этого прототипа
	        if(func==this[name]) {  
	          //Переход вместо этого к родительскому прототипу
	          func=v[name];
	          }
	       }
	       //Отслеживание глубины. На которой мы находимся в стеке наследования
	       depth +=1;
	       //Вызов исполняемой функции со всеми аргументми, кроме первого (в котором хранится имя исполняемой функции)
	      ret = func.apply(this. Array.prototype.slice.apply(arguments, [1]));
	      //Сброс глубины стека
	      depth -=1;
	      //Возвращение значения, возвращаемого исполняемой функцией
	      return ret;
	      });
	      return this;
	      });

Привожу с комментами из книги(они мне не оч помогли) Если есть возможность то можно обьяснить через аську. Помимио общего вопрос как это работает есть пара вопрос с синтаксической точки зрения (зря курил)
Function.prototype.method = function(name, func) {

Function.prototype.method это название функции? Если да то оно что-нибудь значит или просто названо так для удобства.

//Отслеживание, на каком уровне глубины в родительских функциях мы находимся
Что ещё за глубина?

var proto = this.parent = new parent();
Что за парент? Вообще когда одна функция наследует метода обьекта (или наоборот(поправте как правильно)) что является родителем и связано это как-то с передаваемым параметром функции
function(parent) {


if(depth){
Что за Если depth то есть если depth что. Звучит как например Если Вася а должно например Если Вася==1 Если Вася существует

И можно поподробней про метод Apply (ответ что метод Apply похож на call не писать(про него тоже можно расказать)).
Вроде всё.

Последний раз редактировалось zzz, 11.08.2009 в 10:50.
Ответить с цитированием