Можно ли проверить, является ли функция функцией JavaScript или определенной разработчиком функцией? - PullRequest
2 голосов
/ 14 апреля 2010

Учитывая функцию, я хотел бы знать, является ли это определяемой разработчиком функцией или встроенной функцией, предоставляемой движком JavaScript. Возможно ли это?

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

Ответы [ 3 ]

3 голосов
/ 14 апреля 2010

Я сам нашел решение --- с помощью метода valueOf ().

Скопировано и вставлено следующее :

Метод valueOf возвращает строку, которая представляет исходный код функции. Это переопределяет метод Object.valueOf. Метод valueOf обычно вызывается JavaScript за кулисами, но для демонстрации вывода следующий код сначала создает объект Function с именем Car, а затем отображает значение этой функции:

Код: функциональная машина (марка, модель, год выпуска) {this.make = make, this.model = модель, this.year = год} document.write (car.valueOf ())

Выход: функциональный автомобиль (марка, модель, год) {this.make = make, this.model = модель, this.year = год

Со встроенным объектом Function метод valueOf выдаст следующую строку:

Выход: function Function () {[собственный код]}.

2 голосов
/ 14 апреля 2010

Метод valueOf, который вы упомянули в своем ответе , не будет работать так, как вы его упомянули.

Function.prototype не имеет метода valueOf, он наследуется от Object.prototype, и этот метод просто возвращает тот же объект функции, где вы его вызываете :

Function.valueOf() === Function; // true

Я думаю, вы путаете его с методом toString (или вы предупреждаете о вызове метода valueOf, который вызывает в большинстве браузеров неявное преобразование ToString).

Однако вы можете использовать метод toString непосредственно для объектов функций, а в почти всех реализациях вернет вам строковое представление, содержащее "[native code]" в теле функции, я бы не рекомендовал это слишком много, потому что метод Function.prototype.toString зависит от реализации ...

function isNative(fn) {
  return /native code/.test(fn.toString);
}

isNative(Function); // true
isNative(function () {}); // false

Еще раз советую вам, что есть некоторые браузеры, которые будут возвращать разные результаты при использовании метода toString для функций, например, некоторые мобильные браузеры будут возвращать одну и ту же строку для любого объекта функции.

2 голосов
/ 14 апреля 2010

В общем смысле нет. Встроенные в Javascript объекты и функции не имеют (или не имеют) каких-либо специальных свойств, которые можно протестировать во время выполнения, что гарантирует, что это не определенная разработчиком функция. Все методы и объекты могут быть переопределены разработчиком.

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