我想您在示例中的某处意思是将某些内容设置为new animate()。如果不使用new,我稍微解释一下会发生什么:
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'); };
只有前两个函数,#1和#2,可以从animate变量中调用。
animate.angular();
animate.circular();
如果您创建了一个新的animate(),则可以调用接下来的两个函数#3和#4(但不是#1或#2)。
var ani2 = new animate();
ani2.angular();
ani2.circular();
此外,animate()是一个函数,但ani2不是。
console.log(5, typeof animate);
console.log(6, typeof ani2);
console.log(7, animate());
虽然ani2已经被创建,但你可以通过animate.prototype向它添加新成员。
animate.prototype.bark = function(){ console.log(8, 'bark'); };
ani2.bark();
动画变量并不继承自它的原型。
console.log(9, typeof ani2.bark);
console.log(10, typeof animate.bark);
请注意,ani2并不继承直接应用于animate变量的成员。它只继承自animate.prototype。
animate.paperclip = function(){ console.log(11, "paperclip"); };
animate.paperclip();
console.log(12, typeof ani2.paperclip);
console.log(13, typeof animate.paperclip);
您还可以在构造函数中使用this关键字,例如animate,以向new子项添加实例成员。
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);
因为被修改,为anime2.z分配了一个单独的内存实例,而anime1和anime3仍然共享一个节俭的未修改的z。
a、b和c成员不是以同样的方式“公共”的。它们是在构造函数中立即使用this和new Anime()(而不是从Anime.prototype继承)分配的。另外,原型上的a成员总是由构造函数“个性化”的。
永远不要忘记new关键字,否则它将不能正常工作。例如,在没有使用new调用的构造函数中,this指向全局对象。
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);
这是输出结果。Tom建议的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
*/