Je pense que vous vouliez mettre quelque chose égal à ANIMÉE() quelque part dans votre exemple. Sans l'aide nouvelle Je vais élaborer un peu sur ce qui se passe:
var animate = function(){ console.log(0, 'animate'); };
animate.angular = function(){ console.log(1, 'animate.angular'); };
animate.circular = function(){ console.log(2, 'animate.circular'); };
animate.prototype.angular = function(){ console.log(3, 'animate.prototype.angular'); };
animate.prototype.circular = function(){ console.log(4, 'animate.prototype.circular'); };
Seules les deux premières fonctions, # 1 & # 2, sont remboursables par anticipation de la variable Animer.
animate.angular();
animate.circular();
Si vous créez un ANIMÉE() vous pouvez appeler les deux suivants, # 3 & # 4, (mais pas n ° 1 ou n ° 2).
var ani2 = new animate();
ani2.angular();
ani2.circular();
De même, animate() est une fonction mais ani2 ne l'est pas.
console.log(5, typeof animate);
console.log(6, typeof ani2);
console.log(7, animate());
Bien que ANI2 a déjà été créé, vous pouvez ajouter de nouveaux membres via le animate.prototype.
animate.prototype.bark = function(){ console.log(8, 'bark'); };
ani2.bark();
La variable d'animation n'hérite pas de son prototype.
console.log(9, typeof ani2.bark);
console.log(10, typeof animate.bark);
Notez que ani2 n'hérite pas des membres appliqués directement à la variable d'animation. Il hérite uniquement de animate.prototype.
animate.paperclip = function(){ console.log(11, "paperclip"); };
animate.paperclip();
console.log(12, typeof ani2.paperclip);
console.log(13, typeof animate.paperclip);
Vous pouvez également utiliser le mot-clé du ce dans une fonction constructeur comme Animer pour ajouter des membres d'instance nouveaux enfants.
var Anime = function(a,b){ this.a=a; this.b=b; this.c=console; };
var anime1 = new Anime(14, 'anime1');
var anime2 = new Anime(15, 'anime2');
anime1.c.log(anime1.a, anime1.b);
anime2.c.log(anime2.a, anime2.b);
Anime.prototype.a = 16;
Anime.prototype.z = 'z';
var anime3 = new Anime(17, 'anime3');
anime3.c.log(18, anime3.a, anime3.b, anime3.z, " ", anime2.a, anime2.b, anime2.z, " ", anime1.a, anime1.b, anime1.z);
anime2.z='N';
anime3.c.log(19, anime3.a, anime3.b, anime3.z, " ", anime2.a, anime2.b, anime2.z, " ", anime1.a, anime1.b, anime1.z);
mémoire a été allouée automatiquement une instance distincte de anime2.z seulement parce qu'il a été modifié, anime1 & anime3 encore "partager" un non modifié Thrifty z.
Les membres a, b et c ne sont pas "communaux" de la même manière. Ils ont été alloués immédiatement en utilisant ce dans le constructeur, new Anime(), (pas hérité de Anime.prototype). De plus, le membre du prototype sera toujours "individualisé" par le constructeur.
N'oubliez jamais le nouveau mot-clé ou tout ne fonctionne pas comme il se doit. Par exemple, ce pointe vers l'objet global dans un constructeur appelé sans new.
console.log(20, typeof window.a, typeof window.b, typeof window.c);
var opps = Anime(21, 'zapp');
console.log(22, typeof window.a, typeof window.b, typeof window.c);
console.log(23, typeof opps);
Voici la sortie. Et une seconde pour Tom suggérant les vidéos de Douglas Crockford!
/*
1 animate.angular
2 animate.circular
0 animate
3 animate.prototype.angular
4 animate.prototype.circular
5 function
6 object
0 animate
7 undefined
8 bark
9 function
10 undefined
11 paperclip
12 undefined
13 function
14 anime1
15 anime2
18 17 anime3 z 15 anime2 z 14 anime1 z
19 17 anime3 z 15 anime2 N 14 anime1 z
20 undefined undefined undefined
22 number string object
23 undefined
*/
Une autre excellente réponse qui explique en grande partie l'héritage Prototypical (en particulier par JavaScript): http://stackoverflow.com/questions/1595611/how-to-properly-create-a-custom-object-in-javascript/1598077 # 1598077 –
Voir aussi: http://stackoverflow.com/questions/186244/what-does-it-mean-that-javascript-is-a-prototype-based-language –