Подтвердить что ты не робот

Расширение типов в JavaScript

Я читаю Douglas Crockford JavaScript: The Good Parts, и я немного смущен. В главе 4 в разделе "Расширение типов" он создает ярлык для добавления метода.

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

Он говорит:

Увеличивая функцию .prototype с помощью метода "метод", мы больше не необходимо ввести имя свойства прототипа. Это немного уродства теперь можно скрыть.

Затем он продолжает использовать это, чтобы добавить метод "integer" к прототипу номера с этим.

Number.method('integer', function () {
    return Math[this < 0 ? 'ceil' : 'floor'](this);
});

document.writeln((-10 / 3).integer()); // -3

Я немного запутался здесь... потому что мы добавили метод метода к прототипу Function, а не прототипу Number. И, насколько мне известно, объект Number не наследуется от прототипа Function (хотя, возможно, я там не прав). Я вижу, что это работает, но я не понимаю, почему объекты Number могут использовать этот метод метода для добавления... методов.

4b9b3361

Ответ 1

Я предполагаю, что это работает, потому что Number является функцией.

Как показано здесь: http://jsfiddle.net/zCbdB/1

Ответ 2

Number на самом деле является функцией. Любой конструктор является функцией.

Один из способов думать о типах в javascript - сказать, что тип - это просто функция Foo, которая имеет свойство .prototype. Это прототип любого объекта, который создается с помощью ключевого слова new, как в new Foo(). По соглашению Foo выполняется заглавная буква, указывающая, что он является конструктором.

Ответ 3

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

В этом блоке вы создали метод, называемый методом, доступным для всех объектов через прототипное наследование. Функции производятся из Function.prototype, который происходит из Object.prototype. Таким образом, строки и числа будут иметь доступ к методу Object.prototype, называемому методом в этом объявлении.

 Number.method('integer', function () {
    return Math[this < 0 ? 'ceil' : 'floor'](this);
  });

document.writeln((-10 / 3).integer()); // -3

В этом втором блоке вы в основном вызываете метод, который уже доступен в прототипе объекта и передающий требуемый параметр в этом случае name = 'integer' и значение, равное

function () {
    return Math[this < 0 ? 'ceil' : 'floor'](this);
  });

Наконец, в последнем утверждении вы передаете пару с именем name для результата -3

Ответ 4

Вот пример, который может помочь:

var num = Number('1.2');
alert(num instanceof Number); // true
alert(num instanceof Function); // false
alert(Number instanceof Number); // false
alert(Number instanceof Function); // true

Еще один способ подумать о том, что в Javascript Function тянет двойную функцию как тип класса - тип типов. Поэтому это добавление метода для типов.