2010-10-19 2 views
22

Дуглас Крокфорд писал в своей книге (Page 4):«метод» метод в книге Крокфорд в: Javascript: The Good Parts

На протяжении всей книги, метод method используется для определения новых методов, это его определение:

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

Затем он начинает использовать этот method добавить метод в Number, String, Function, Object, Array, RegExp, а вот полный список:

P33:

Number.method('integer', function() {...}); 
String.method('trim', function() {...}); 

P40 (не уверен, если есть опечатка в Page 41: конец()):

String.method('deentityify', function() {...}()); 

P43 & P44:

Function.method('curry', function() {...}); 

P47 (я запутался здесь, дон» знаю, почему Крокфорд определить new метод, и он кажется, никогда не использовать new метод в книге):

Function.method('new', function() {...}); 

P48:

Function.method('inherits', function (Parent) {...}); 

Р54:

Object.method('superior', function (name) {...}); 

P62:

Array.method('reduce', function (f, value) {...}); 

Р79:

Array.method('pop', function() {...}); 
Array.method('push', function() {...}); 
Array.method('shift', function() {...}); 

Р82:

Array.method('splice', function (start, deleteCount) {...}); 

P84:

Function.method('bind', function (that) {...}); 

P88:

RegExp.method('test', function (string) {...}); 
String.method('charAt', function (pos) {...}); 

P90 (не уверен, если есть опечатка в Page 91: конец()):

String.method('entityify', function() {...}()); 

определение method основан на Function, почему его можно использовать в Number, String, Object, Array, RegExp кроме Function? И может ли этот method использоваться для других типов данных?

Еще один маленький вопрос: в определении Array.dim, Array.matrix, Array.identity не используется выше method, почему?

ответ

20

Все нативные функции в JavaScript наследуются от Function.prototype. Number, String, Object, Array и RegExp - все функции, поэтому они наследуют от Function.prototype.

method предназначен для вызова функций-конструкторов. Его задача состоит в том, чтобы сделать функцию, которую вы ей поставляете, в метод, который существует для каждого объекта, созданного функцией-конструктором, на которую вы назвали method. Вы заметите, что в функциях, которые Крокфорд переходит на method, он использует , что является ссылкой на объект, на который был вызван метод. Array.dim, Array.matrix и Array.identity не используют this, потому что они работают независимо от какого-либо определенного массива и, следовательно, не должны быть методами отдельных объектов массива. Они назначаются как функции функции Array для удобства: они могут одинаково хорошо существовать как функции глобального масштаба.

+0

Я не уверен, если номер, String, Object, Array, RegExp (Может быть, функция и дата и Boolean, а) все функции. Кажется, что они являются глобальными объектами. – John

+1

@ Джон: Уверяю вас, это все функции. Попробуйте 'alert (typeof Number)' и т. Д., Если вы мне не верите, или проверьте спецификацию (раздел 15.1.4): http://www.ecma-international.org/publications/standards/Ecma-262.htm , Они также являются свойствами глобального объекта, если это то, к чему вы обращались. –

+1

@ Джон: Понятно, вы просмотрели документацию Mozilla по адресу https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects. Это правильно, так же как и функции, 'Number',' String', 'Object' и др. Также являются объектами, потому что все функции являются объектами; также верно, что в качестве свойств глобального объекта они доступны во всем мире, поэтому их можно охарактеризовать как «глобальные объекты». Однако в свете существования официально определенного термина «глобальный объект», я считаю использование Mozilla термином «глобальные объекты» довольно бесполезным. –

4

Как и в сторону, на P40:

Конец() означает «использовать функцию, что эта функция возвращает», а не внешняя функция, которая возвращает его.

Если он оставил окончательный(), вызов deentityify вернул бы функцию, а не строку.

По собственным словам Дугласа Крокфорд в:

Мы сразу же вызвать функцию мы только что сделали с оператором(). Этот вызов создает и возвращает функцию , которая становится методом deentityify.

3

Решение, данное @Tim Down, является точным, но не полностью ясным.

объект Функция против экземпляра функционального объекта

Прежде всего, в JavaScript, функция также является объектом. Из этого я имею в виду не объект, созданный конструкцией new(), а сама функция. Чтобы избежать путаницы, я бы назвал такие объекты как Объект функции, а для объекта, созданного с использованием функции new() функции, как Объект экземпляра объекта.

_ _ прото и прототип свойства

Любой функциональный объект в JavaScript имеет два свойства: _ _ прото и прототип. Более того, любой объект объекта (созданный с использованием нового конструктора) имеет свойство _ proto _. _ proto _ - это то, что определяет наследование. Некоторые хороший ресурс на это можно найти на

http://zeekat.nl/articles/constructors-considered-mildly-confusing.html

Как наследование определяется?

Объект objA наследует другой объект ObjC, если objA и ObjC соединены через любое количество _ _ прото. Поэтому, если objA имеет _ proto _, равный objB, а objB имеет _ proto _, равный objC, тогда objA наследует objB и objC, тогда как objB наследует objC.

Что подразумевается под наследованием?

Это означает, что любой объект может наследовать использовать любое свойство наследуемого объекта.

Что Function.prototype

Это объект, которого _ _ прото каждого функции объекта относится. Это означает, что каждый Объект функции имеет доступ к свойствам Function.prototype, так как каждый Объект функции наследует объект Function.prototype. Это также означает, что если в объект Function.prototype добавлено свойство , оно будет доступно всем возможным объектам в javascript. Сюда входят строки, номера и т. Д.

этот.прототип [имя] = func;

это относится к объекта Function, когда «» метод вызывается из объекта функции s как число, строка и т.д. Это означает, что теперь у нас есть новое свойство в объекте Function с именем «name» и его функция «func».

Что хорошее прототипа свойства объекта Функции

функции объект 's прототип упоминается в функции объекте экземпляр' ы _ proto _, созданный с использованием новой конструкции этой функции.

Если следующее был выполнен:

Number.method ('целое', функция() {...});

то Number.prototype имеет то, что целое число метод, определенный в нем. Это означает, что каждый экземпляр объекта , например. новый номер (2.4), «наследует» это новое свойство «целое» от Number.prototype, поскольку этот объект объекта объекта будет иметь свой _ proto _, установленный в Number.prototype.

0

Попробуйте использовать этот метод прототипа:

String.prototype.deentityify = function() { ... } 

Тогда:

document.writeln('<">'.deentityify()); 

Мы можем увидеть: <">

0

Пример: Карринг можно переписать следующим образом, если кто-то застрял , См jsFiddle demo

Function.prototype.curry = function () { 
var slice = Array.prototype.slice; 
var args = slice.apply(arguments); 
var that = this; 
return function() { 
    return that.apply(null,args.concat (slice.apply(arguments))); 
} 
}; 
var add = function(a, b) 
{ 
    return a + b; 
} 
var add1 = add.curry(1); 
document.writeln(add1(6)); // 7 
Смежные вопросы