|
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 не писать(про него тоже можно расказать)). Вроде всё. |
Первое что попалось на глаза это inhertis вместо inherits. Смотрю дальше, вроде что-то интересное.
|
Цитата:
|
Цитата:
Цитата:
Цитата:
http://javascript.ru/tutorial/object это читали? |
Цитата:
|
После радости от конструкции:
Function.prototype.method = function(name, func) {
this.prototype[name] = func;
return this;
};
Function.method("inherits", function(parent) {/*...*/});
сразу пришел в ужас от: var proto = this.parent = new parent(); Либо это что-то очень гениальное, либо книгу пора выкидывать. |
Код написан Дугласом Крокфордом создателем библеотеки 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){
|
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
| Часовой пояс GMT +3, время: 13:41. |
|