«метод» метод в книге Крокфорда: Javascript: хорошие части - PullRequest
23 голосов
/ 19 октября 2010

Дуглас Крокфорд писал в своей книге (стр. 4):

На протяжении всей книги метод 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 (не уверен, что есть опечаткана странице 41: end ()):

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

P43 и P44:

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

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

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

P48:

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

P54:

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

P62:

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

P79:

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

P82:

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

P84:

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

P88:

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

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

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

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

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

Ответы [ 5 ]

22 голосов
/ 19 октября 2010

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

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

4 голосов
/ 01 августа 2012

В качестве отступления, на P40:

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

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

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

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

3 голосов
/ 24 декабря 2014

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

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

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

_ proto _ и свойства prototype

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

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

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

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

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

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

Что такое Function.prototype

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

this.prototype [name] = func;

это относится к Функциональному объекту , когда 'метод' вызывается из Функциональному объекту , например, Number, String и т. Д. Это означает, чтоу нас теперь есть новое свойство в объект функции с именем "name" и функцией 'func'.

Что хорошего в prototype свойство Объект функции

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

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

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

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

0 голосов
/ 28 ноября 2017

Пример: карри можно переписать следующим образом, если кто-то застрял. См. 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
0 голосов
/ 14 февраля 2017

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

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

Тогда:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...