Допустимо ли добавить атрибут в функцию JavaScript?

Допустимо ли добавить атрибут или значение в функцию JavaScript?

Пример:

var f = 1;

function foo (param) {
    f++;
}

var fooFunc = foo;

fooFunc.dummy = f;

console.log('fooFunc: ' + fooFunc);
console.log('fooFunc.dummy: ' + fooFunc.dummy);

Приведенный выше пример создает функцию (foo), затем присваивает его новой переменной (fooFunc), а затем добавляет dummy приписывать fooFunc,

При запуске этот пример сначала печатает текст функции, а затем - ожидаемое значение (1 в этом случае). При печати функции она не показывает никаких признаков dummy значение:

fooFunc: function foo(param) {
    f++;
}
fooFunc.dummy: 1 

JsFiddle здесь - откройте консоль JavaScript браузера, чтобы увидеть сообщения журнала: http://jsfiddle.net/nwinkler/BwvLf/

Почему это работает? А где находится dummy атрибут сохранен, и почему он не печатается, когда я регистрирую функцию?

Наконец, даже если это работает, это хорошая идея (или приемлемая практика), чтобы использовать это? Я не хочу начинать открытое обсуждение этого вопроса, а скорее посмотрим, есть ли документированное использование этого, или люди не одобряют это в руководствах по кодированию JavaScript.

3 ответа

Решение

Все, кроме примитивов ( null, undefined, number, string, boolean) в JavaScript, являются объектами. Так что функции в основном объекты.

Объекты в JavaScript могут иметь свойства и методы, а значит и функции.

все функции наследуются от Function.prototype и имеют определенные свойства ( name, length) и методы ( .call, .apply), проходящие через эту цепочку.

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

Более подробная информация: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function

Давайте посмотрим на документацию ECMAScript (на которой основан стандартный JavaScript). Вот третий. версия этого:

http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf

Перейдите к главе 15 "Нативные объекты ECMAScript". 15.3 > Функциональные объекты.

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

console.log('fooFunc.name: ' + fooFunc.name);

В вашем случае должно отображаться "foo". Поскольку он достаточно хорошо задокументирован, вы можете использовать его как стандартный способ, хотя он не так широко распространен и может показаться немного необычным.

Надеюсь это поможет.

Это нормальное поведение объекта, "приемлемое" или нет.

Используя ключевое слово function, вы фактически вызываете встроенный предопределенный конструктор Function(). Как и любой конструктор объекта, он возвращает объект после его создания. Как и любой объект, возвращаемый объект может иметь свойства, включая другие функции в качестве свойств метода.

var adder = function(a, b){return a+b};
adder.subtracter = function(a, b){return a-b};
console.log(adder(1,2)); // 3
console.log(adder.subtracter(1,2)); // -1

СОВЕТ: если вы хотите увидеть объект сумматора и его метод вычитания, переключитесь на представление DOM из представления консоли после запуска приведенного выше кода в консоли, а затем выполните поиск "сумматор". Вы увидите объект там, а затем вы можете свернуть, чтобы увидеть, из чего он сделан, включая объект вычитателя.

Конечно, функциональный объект - это специальный нативный объект, который позволяет совершать такие вызовы: adder() и фактически запускать некоторый код. Тот факт, что функциональный объект труднее проверять на наличие пользовательских присоединенных свойств в сочетании с его собственными специальными обработками объектов (чтение встроенного ограничительного поведения), должен дать вам подсказку о том, что, хотя это возможно, присоединение пользовательских свойств не является ни предназначенным, ни хорошее использование функционального объекта.

Другие вопросы по тегам