Пример из: «Javascript - The Good Parts» - PullRequest
7 голосов
/ 01 июня 2010

Какое «безобразие» решает следующее? Есть кое-что, чего я не получаю, и я был бы признателен за помощь в понимании того, что это такое.


Например, добавив Function.prototype, мы можем сделать метод доступным для всех функций:

Function.prototype.method = function (name, func) {
     this.prototype[name] = func;
     return this; 
};

Расширяя Function.prototype методом метода, нам больше не нужно вводить имя свойства prototype. Это уродство теперь можно скрыть.

1 Ответ

15 голосов
/ 01 июня 2010

Ну, уродство субъективно, но посмотрим.

Вы обычно пишете:

function Foo () {}
Foo.prototype.method1 = function ()  { /*...*/ };
Foo.prototype.method2 = function ()  { /*...*/ };

Вы расширяете объект prototype функцией конструктора со свойствами, которые вы хотите наследовать, в экземпляры, созданные оператором new.

Например, с помощью var obj = new Foo(); вы создаете экземпляр конструктора Foo, этот объект наследует все свойства, связанные с объектом Foo.prototype и другими объектами, расположенными выше в цепочке прототипов .

Метод Крокфорда делает то же самое, этот метод определен в объекте Function.prototype, все функции наследуются от этого объекта, поэтому вы можете вызывать метод следующим образом:

function Foo () {}
Foo.method('method1', function () { /*...*/ });
Foo.method('method2', function () { /*...*/ });

Это просто скрывает prototype слово из кода, которое Крокфорд считает некрасивым ...

"JavaScript The Good Parts" - действительно хорошая книга, но я думаю, что она основана на личной точке зрения Дугласа Крокфорда на язык.

Я согласен с ним во многих вещах, но я также не согласен с некоторыми аспектами ...

...