2016-10-07 1 views
1

Voici mon code:terme général pour javascript intégré objet global

function convertStringToFunction(string) { 
    var fn = String.prototype[string]; 
    // need to replace 'String' with something 
    return (typeof fn) === 'function'; 
} 
convertStringToFunction('reduce'); // => false but need to return true 
convertStringToFunction('toUpperCase') // => true 

L'objectif est de rechercher et appeler une fonction intégrée avec chaîne de nom de la fonction. Cependant, si la chaîne peut prendre n'importe quel nom de fonction comme reduce et toUpperCase. Comment puis-je m'assurer que fn est toujours une fonction? dans les autres termes, la fonction précédente devrait toujours être vraie.

+6

Rien ne cloche avec votre code, les chaînes n'ont pas de fonction 'reduce' ... –

+0

Je veux convertirStringToFunction() pour convertir une chaîne en n'importe quelle fonction intégrée telle qu'elle existe. donc je me demande si quelque chose comme allBuiltinObjec.prototype existe. –

+1

Alors pourquoi vérifiez-vous si le nom de la fonction est une propriété de 'String.prototype'? –

Répondre

2

Je pense c'est ce que vous voulez:

// this is currently the *only* certain way to get a 
// reference to the global object 
var global = new Function('return this;')(); 

// this is dicey, see note below 
var isNative = function(fn) { 
    return fn.toString().match(/native code/i); 
}; 

// this will return a true if the passed in name is a built-in 
// function of any of the global constructors or namespace objects 
// like Math and JSON or the global object itself. 
var isBuiltInFunction = function(name) { 
    var tests = [ 
    global, 
    String, 
    Function, 
    RegExp, 
    Boolean, 
    Number, 
    Object, 
    Array, 
    Math, 
    JSON 
    ]; 

    // test for native Promises 
    if (typeof Promise === 'function' && isNative(Promise)) { 
    tests.push(Promise); 
    } 

    // test for document 
    if (typeof document !== undefined) { 
    tests.push(document); 
    } 

    // test for Symbol 
    if (typeof Symbol === 'function' && isNative(Symbol)) { 
    tests.push(Symbol); 
    } 

    return tests.some(function(obj) { 
    return typeof obj[name] === 'function' && isNative(obj[name]); 
    }); 
}; 

Notez que le Function.prototype.toString dépend de la mise en œuvre, cela peut ne pas fonctionner sur toutes les plateformes. Vous pouvez l'omettre, mais il comptera alors les versions définies par l'utilisateur comme 'intégrées'.

+0

Je pense qu'il y a un bug dans votre code. Mais je comprends ce que tu veux dire maintenant. Merci. –