Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   JavaScript Классическое наследование (https://javascript.ru/forum/misc/4652-javascript-klassicheskoe-nasledovanie.html)

zzz 11.08.2009 10:37

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 не писать(про него тоже можно расказать)).
Вроде всё.

Riim 11.08.2009 10:49

Первое что попалось на глаза это inhertis вместо inherits. Смотрю дальше, вроде что-то интересное.

zzz 11.08.2009 10:51

Цитата:

Сообщение от Riim (Сообщение 26443)
Первое что попалось на глаза это inhertis вместо inherits. Смотрю дальше, вроде что-то интересное.

подправил.

Kolyaj 11.08.2009 10:59

Цитата:

Сообщение от zzz
Function.prototype.method это название функции?

Цитата:

Сообщение от zzz
Что за Если depth то есть если depth что.

Цитата:

Сообщение от zzz
И можно поподробней про метод Apply

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

http://javascript.ru/tutorial/object это читали?

zzz 11.08.2009 11:01

Цитата:

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

http://javascript.ru/tutorial/object это читали?

Именно эту статью не читал но про объекты и ООП читал

Riim 11.08.2009 11:05

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


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

zzz 11.08.2009 11:11

Код написан Дугласом Крокфордом создателем библеотеки 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){

Kolyaj 11.08.2009 11:18

Цитата:

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

if(depth){

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

Цитата:

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

А что тут не так?

zzz 11.08.2009 11:20

Цитата:

Сообщение от Kolyaj
if(depth){

Ещё вопрос как она может не существовать если она указана в родительской функции?

Riim 11.08.2009 11:21

Цитата:

Сообщение от zzz
ему можно ставить памятник уже за один только вот этот кусок кода

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


Часовой пояс GMT +3, время: 07:09.