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