TL; DR
- Шпионы - это функции.
- Обзор консоли инструментов разработки или наблюдения не отображает свойства объектов функций.
Шпионы
Шпионы - это функции, потому что они должны использоваться в качестве прокси функций или заменять функции на объектах для отслеживания вызовов к ним.Шпион будет внутренне отслеживать вызовы, чтобы разрешить программный контроль.
Javascript
Вы можете не знать, что в функциях Javascript тоже есть объекты.
В JavaScript функцииявляются первоклассными объектами, потому что они могут иметь свойства и методы, как и любой другой объект.Что отличает их от других объектов, так это то, что функции могут быть вызваны.Вкратце, они являются объектами Function.
Источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions
Функции могут иметь свойства, а свойства могут быть определены или настроены так же, как и для «обычных» объектов.
Причина, по которой шпион не показывает атрибуты в инспекторе ни отладчиком, ни console.log()
, заключается в том, что инструменты разработчика знают, что это функция, и функции отображаются как таковые.
Devtools
Инструменты разработчика, очевидно, предполагают, что Function
объекты (обычно) не имеют специальных свойств и, следовательно, не будут перечислять их.
Вы можете наблюдать это и с базовыми функциями.Введите это в консоли:
var f = function() { }
f.foo = 42;
f; // The property won't be printed
Хотя вы можете проверить шпионский объект в отладчике при остановке в точке останова.Вы бы добавили ссылку на панель «Смотреть» на вкладке «Источник».Затем вы можете открыть объект функции и проверить свойства.
После предыдущего эксперимента вы действительно можете проверить функцию, добавив выражение наблюдения для f
.
Шпионский объект Sinon подпроверка:
![Chrome dev tools showing details on an inspected spy](https://i.stack.imgur.com/UQdGe.png)