Ответ 1
Я предполагаю, что это работает, потому что Number
является функцией.
Как показано здесь: http://jsfiddle.net/zCbdB/1
Я читаю 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 могут использовать этот метод метода для добавления... методов.
Я предполагаю, что это работает, потому что Number
является функцией.
Как показано здесь: http://jsfiddle.net/zCbdB/1
Number
на самом деле является функцией. Любой конструктор является функцией.
Один из способов думать о типах в javascript - сказать, что тип - это просто функция Foo
, которая имеет свойство .prototype
. Это прототип любого объекта, который создается с помощью ключевого слова new
, как в new Foo()
. По соглашению Foo
выполняется заглавная буква, указывающая, что он является конструктором.
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
Вот пример, который может помочь:
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
тянет двойную функцию как тип класса - тип типов. Поэтому это добавление метода для типов.