Eu sempre encontro situações em que preciso verificar se uma função é um código nativo-esse é um conteúdo muito importante no teste funcional: a função é suportada pelo navegador embutido ou simulado através de bibliotecas de classes de terceiros. Para detectar isso, a maneira mais fácil é, obviamente, julgar o valor retornado pelo método da função da tostragem.
Código JavaScript
Na verdade, é bastante simples determinar se uma função é nativa:
// Determine se a função nativa énativa (fn) {// exemplo: // alert.toString () // "function alert () {[nativo code]}" // '' + fn utiliza a conversão implícita do tipo JS. return (// {/s*/[código nativo/]/s*/}/). test ('' + fn); }Converta a função em uma representação de string e execute a correspondência regular, este é o princípio da implementação.
Versão atualizada, atualização!
; (function () {// Obtenha o método do objeto de tonstring, usado para processar o interno (interno) do valor aprovado no parâmetro `[[class]]` var tostring = object.prototype.ToString; // obtenha o método de tostring da função, usado para manipular o código de decomposição de funções var; Construtores (construtores de host), // (Safari> 4; Realmente emitido Matriz específica) var rehostctor =/^/[Object. +? Construtor/] $/; String (ToString) // Escape todos os caracteres especiais relacionados a expressões regulares. de parâmetros do método. .place (/tostring | (função).*? (? = /// () | para. +? (? = ///])/g, '$ 1.*?') // palavra final + '$'); função énativa (value) {// Juiz Tipo de tipo de var tipo = tipoof valor; Retorno tipo == 'função' // Use o método nativo `função#tostring` para chamar, // em vez de valorizar seu próprio método` ToString`, // para evitar ser enganado por falsificação. ? RENATIVO.TEST (FNTOSTRING.CALL (valor)) // Se o tipo não for 'função', // você precisa verificar o objeto host (objeto host), // porque alguns ambientes (navegadores) tratarão as matrizes digitadas como métodos Dom // nesse momento, o padrão nativo padrão pode não ser correspondido: (valor && tipo == '' Object '&& falso; }; // você pode atribuir é nativo à variável/objeto que deseja janela.isnative = isnative; } ());Código de teste:
Isnative (isnative) // false isnative (alert) // true window.isnative (window.isnative) // false window.isnative (window.alert) // true window.isnative (string.tostring) // true