Допустимо ли добавить атрибут в функцию 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). Вот третий. версия этого:
Перейдите к главе 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() и фактически запускать некоторый код. Тот факт, что функциональный объект труднее проверять на наличие пользовательских присоединенных свойств в сочетании с его собственными специальными обработками объектов (чтение встроенного ограничительного поведения), должен дать вам подсказку о том, что, хотя это возможно, присоединение пользовательских свойств не является ни предназначенным, ни хорошее использование функционального объекта.