Какое "уродство" следующее решает? Существует что-то, что я не получаю, и я ценил бы справку, понимающую, каково это.
Например, путем увеличения Function.prototype, мы можем сделать метод доступным для всех функций:
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
Путем увеличения Function.prototype с методом метода мы больше не должны вводить имя опытного свойства. Тот бит уродства может теперь быть скрыт.
Ну, уродство субъективно, но давайте посмотрим.
Обычно пишут:
function Foo () {}
Foo.prototype.method1 = function () { /*...*/ };
Foo.prototype.method2 = function () { /*...*/ };
Вы расширяете прототип
объекта функцией конструктора со свойствами, которые вы хотите передать по наследству экземплярам, созданным оператором new.
Например, с помощью var obj = new Foo();
вы создаете экземпляр конструктора Foo
, этот объект унаследует все свойства, связанные с объектом Foo.prototype
и другими объектами выше в цепочке prototype.
Метод Крокфорда делает то же самое, этот метод определен в объекте Function.prototype
, все функции наследуют от этого объекта, поэтому вы можете вызвать метод следующим образом:
function Foo () {}
Foo.method('method1', function () { /*...*/ });
Foo.method('method2', function () { /*...*/ });
По сути, он просто скрывает слово prototype
из кода, которое Крокфорд считает уродливым...
"JavaScript The Good Parts" - действительно хорошая книга, но я думаю, что она основана на личном восприятии языка Дугласом Крокфордом.
Я согласен с ним во многом, но я также не согласен с некоторыми аспектами...