2012-05-10 4 views
0

Les réponses de cette question dit utiliser pour vérifier si la fonction est définie:Vérifier les fonctions définies natives avec prototype

typeof yourFunction === 'function' 

Mais j'ai essayé cela sur une fonction non standard link(). Et en fait cela est retourné faux. La fonction est disponible sur tous les navigateurs que j'ai essayés - IE, Chrome, Opera, FireFox.

typeof String.link === 'function' // false 
typeof String.link() === 'function' // Uncaught error ... 

Alors quelque part je trouve:

typeof String.prototype.link === 'function' //true 

qui retourne réellement vrai. Quelle est la différence et pourquoi le premier échoue?

Répondre

3

String est une fonction de constructeur, et les fonctions sont également des objets. Vous pouvez ajouter des propriétés à celui-ci.

For example:

function foo(){ 
    alert('from foo'); 
} 

foo.bar = function(){ 
    alert('bar on foo'); 
} 

foo();  //from foo 
foo.bar(); //bar on foo 

C'est la même raison comment $ jQuery agit comme un objet (par exemple. $.each()) et comme une fonction aussi bien (par exemple. $(selector)).

Et:

  • à l'aide String.link accède à une propriété de la fonction constructeur lui-même - qui n'existe pas.

  • utilisant String.prototype.link accès à la fonction link() qui vient avec chaque chaîne - méthode qui existe (et que vous devez utiliser)

+0

Je pensais à ce sujet, [ce] (http://stackoverflow.com/questions/221294/how-do-you-get-a-timestamp-in-javascript) effectivement aidé, et en fait 'typeof String(). link === 'function'' renvoie la valeur true. De cette façon, String crée un objet vide et le lien "availability" doit être vérifié par rapport à celui-ci. – Bakudan

+0

@Milo mais vous créeriez un objet juste pour vérifier 'link' plutôt que de vérifier' link' directement dans le prototype. – Joseph

+0

Oh, je ne pensais pas de cette façon! C'est plus pratique. – Bakudan

0

Parce que la chaîne est l'objet et ne présente pas le lien(). Seules les chaînes ont cette méthode. Regardez:

String//Defines the Object 
String.prototype//Defines the methods and properties that will be bound to a var of the type String 
'foo'//This is a string 
'foo'.link//So it has the link method 
String//This is an Objecy that defines the strings 
String.link//So it doesn't have the link method 
String.prototype//An object that stores the methods and properties of the vars of type String 
String.prototype.link//So it has the link method 
Questions connexes