creo que quería decir para establecer algo igual a nueva animado() algún lugar de su ejemplo. Sin utilizar nueva voy a elaborar un poco sobre lo que sucede:
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'); };
Sólo las dos primeras funciones, # 1 & # 2, se puede llamar desde la variable animado.
animate.angular();
animate.circular();
Si crea una nueva animado() puede llamar a los dos siguientes, # 3 # 4 &, (pero no # 1 o # 2).
var ani2 = new animate();
ani2.angular();
ani2.circular();
Además, animate() es una función pero ani2 no lo es.
console.log(5, typeof animate);
console.log(6, typeof ani2);
console.log(7, animate());
Aunque ani2 ya se ha creado, se puede añadir nuevos miembros a la misma a través de la animate.prototype.
animate.prototype.bark = function(){ console.log(8, 'bark'); };
ani2.bark();
Sin embargo, la variable de animación no hereda de su prototipo.
console.log(9, typeof ani2.bark);
console.log(10, typeof animate.bark);
Tenga en cuenta que ani2 no hereda los miembros aplicados directamente a la variable animada. Solo hereda de animate.prototype.
animate.paperclip = function(){ console.log(11, "paperclip"); };
animate.paperclip();
console.log(12, typeof ani2.paperclip);
console.log(13, typeof animate.paperclip);
También puede utilizar el la presente palabra clave dentro de una función constructora como animado a añadir a los miembros de instancia nuevos niños.
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);
memoria se asigna automáticamente para una instancia independiente de anime2.z sólo porque se modificó, anime1 & anime3 todavía "compartir" una z no modificada ahorrativo.
Los miembros a, b y c no son "comunes" de la misma manera. Se asignaron inmediatamente usando este en el constructor, nuevo Anime(), (no heredado de Anime.prototype). Además, el miembro del prototipo siempre sería "individualizado" por el constructor.
Nunca olvide la nueva palabra clave o nada de eso funciona como debería. Por ejemplo, este apunta al objeto global en un constructor llamado sin nuevo.
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);
Aquí está la salida. ¡Y un segundo para Tom sugiriendo los videos 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
*/
Otra gran respuesta que explica en gran medida la herencia prototípica (específicamente wrt JavaScript): http://stackoverflow.com/questions/1595611/how-to-properly-create-a-custom-object-in-javascript/1598077 # 1598077 –
Ver también: http://stackoverflow.com/questions/186244/what-does-it-mean-that-javascript-is-a-prototype-based-language –