Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 11.08.2009, 10:49
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Первое что попалось на глаза это inhertis вместо inherits. Смотрю дальше, вроде что-то интересное.
Ответить с цитированием
  #3 (permalink)  
Старый 11.08.2009, 10:51
zzz zzz вне форума
Аспирант
Отправить личное сообщение для zzz Посмотреть профиль Найти все сообщения от zzz
 
Регистрация: 06.08.2009
Сообщений: 91

Сообщение от Riim Посмотреть сообщение
Первое что попалось на глаза это inhertis вместо inherits. Смотрю дальше, вроде что-то интересное.
подправил.
Ответить с цитированием
  #4 (permalink)  
Старый 11.08.2009, 10:59
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от zzz
Function.prototype.method это название функции?
Сообщение от zzz
Что за Если depth то есть если depth что.
Сообщение от zzz
И можно поподробней про метод Apply
Рановато вы за наследование взялись, тут местами не то что основы JavaScript, а основы программирования.

http://javascript.ru/tutorial/object это читали?
Ответить с цитированием
  #5 (permalink)  
Старый 11.08.2009, 11:01
zzz zzz вне форума
Аспирант
Отправить личное сообщение для zzz Посмотреть профиль Найти все сообщения от zzz
 
Регистрация: 06.08.2009
Сообщений: 91

Сообщение от Kolyaj Посмотреть сообщение
Рановато вы за наследование взялись, тут местами не то что основы JavaScript, а основы программирования.

http://javascript.ru/tutorial/object это читали?
Именно эту статью не читал но про объекты и ООП читал
Ответить с цитированием
  #6 (permalink)  
Старый 11.08.2009, 11:05
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

После радости от конструкции:
Function.prototype.method = function(name, func) {
    this.prototype[name] = func;
    return this;
};
Function.method("inherits", function(parent) {/*...*/});


сразу пришел в ужас от: var proto = this.parent = new parent();
Либо это что-то очень гениальное, либо книгу пора выкидывать.

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

Код написан Дугласом Крокфордом создателем библеотеки JSON как замену XML
Дуглас Крокфорд. это главный архитектор по JavaScript в Yahoo. но и без этого, имно, ему можно ставить памятник уже за один только вот этот кусок кода:

function object(o) {
function F() {}
F.prototype = o;
return new F();
}

его сайт http://javascript.crockford.com/
Так что скорее гениальное)

Прочитал что...
В javascript нельзя проверить существование глобальной переменной простым if:

if (x) { ... }


Если x не определен, то конструкция if (x) вызовет ошибку javascript.

Так почему работает
if(depth){

Последний раз редактировалось zzz, 11.08.2009 в 11:16.
Ответить с цитированием
  #8 (permalink)  
Старый 11.08.2009, 11:18
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от zzz
Так почему работает

if(depth){
потому что depth существующая локальная переменная.

Сообщение от Riim
сразу пришел в ужас от: var proto = this.parent = new parent();
Либо это что-то очень гениальное, либо книгу пора выкидывать.
А что тут не так?
Ответить с цитированием
  #9 (permalink)  
Старый 11.08.2009, 11:20
zzz zzz вне форума
Аспирант
Отправить личное сообщение для zzz Посмотреть профиль Найти все сообщения от zzz
 
Регистрация: 06.08.2009
Сообщений: 91

Сообщение от Kolyaj
if(depth){
Ещё вопрос как она может не существовать если она указана в родительской функции?
Ответить с цитированием
  #10 (permalink)  
Старый 11.08.2009, 11:21
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от zzz
ему можно ставить памятник уже за один только вот этот кусок кода
Приписывать здесь кому-либо авторство не совсем правильно, но если уж кто и автор, то это создатели javascript-а, но никак не архитектор из Yahoo.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лучшая книга по JavaScript Systemnik Оффтопик 27 26.08.2012 16:54
Помогите с javascript andruhin Общие вопросы Javascript 12 04.05.2012 10:05
Собрался силами, собираюсь освоить Javascript walker Общие вопросы Javascript 14 20.03.2012 16:17
Программист на JavaScript (удалённо) Vadym Работа 1 28.01.2009 13:57
Нужен Старший разработчик JavaScript Yandex Работа 17 19.08.2008 16:43