JavaScript: различать нативный и нативный элементы - PullRequest
3 голосов
/ 21 июля 2011

Есть ли способ определить, является ли данная функция, скажем, Array.prototype.forEach, нативной (например, браузер реализует ECMAScript5) или функцией, добавленной сценариями JavaScript страницы?

Ответы [ 6 ]

1 голос
/ 21 июля 2011

Воспользуйтесь перечисляемым свойством нативного метода.

function isNative(prop){
    var op= this.prototype;
    if(prop in op){
        for(var p in op){
            if(p=== prop){
                return false;
            }
        }
        return true
    }
    return null;
}
isNative.call(Array, 'map');
1 голос
/ 21 июля 2011

Я бы сказал: alert ( function );

Если он появляется как "собственный код", то это собственный код ...

1 голос
/ 21 июля 2011

Вы можете попробовать положить его на консоль и посмотреть, что там будет.

0 голосов
/ 21 июля 2011

Это не идеально, но как можно ближе. Я считаю, что Opera (? Какая-то версия? ) не поддерживает должным образом декомпиляцию Function s, а также не поддерживает Opera mobile. Это ты называешь тем, что хочешь делать. Это также позволяет избежать злобных взломов Роба.

function isNative(obj){
  var toString = obj.toString;
  delete obj.toString;
  var ret =  obj.toString().match(/\s*function\s+([a-z0-9]+)\s*\(\s*\)\s*{\s*\[native code\]/i)
  obj.toString = toString;
  return ret;
} 

Также возвращает имя функции, например

 isNative(window.Array)[1] = "Array"
0 голосов
/ 21 июля 2011

Для тех, кто предлагает метод «нативный код»:

function Foo() {}
Foo.prototype.toString = function() {
  return 'function slice() {\n    [native code]\n}';
}

var foo = new Foo();
alert(foo);

/* Shows:
**   function Array() {
**       [native code]
**   }
*/

Некоторые браузеры также включают фразу «собственный код» для объектов хоста.

ALS, согласно ECMA-262 § 4.3.6:

нативный объект

объект в реализации ECMAScript, чей семантика полностью определяется этой спецификацией, а не среда хоста.

ПРИМЕЧАНИЕ. Стандартные собственные объекты определены в данной спецификации. Немного встроенные объекты встроены; другие могут быть построены во время ход выполнения программы ECMAScript.

Так, если пользовательский код добавляет метод Array.prototype.forEach , то он является собственным объектом. Возможно, ОП действительно означает встроенный метод.

0 голосов
/ 21 июля 2011

Используется метод, который, кажется, работает в браузерах, которые я пробовал (хотя я не думаю, что это указано стандартом):

function checkMethodType(m) {
    if (!m) {
        return("doesn't exist");
    } else if (m.toString().search(/\[native code\]/) != -1) {
        return("native");
    } else {
        return("non-native");
    }
}

checkMethodType(Array.prototype.forEach);    // native in modern browsers
checkMethodType(Array.prototype.myMethod);   // non-native

jsFiddle здесь: http://jsfiddle.net/jfriend00/GJJqQ/.

Этот метод является нестандартным и не гарантирует его надежности.На самом деле, вы можете обмануть его, если захотите, поместив строку [native code] в не нативный метод.Но это может быть полезно в любом случае в зависимости от того, для чего вы этого хотите.Я не знаю ни одного 100% надежного метода.

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