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'); };
最初の2つの機能、#1 &#2を、アニメーション変数から呼び出し可能です。
animate.angular();
animate.circular();
あなたは新しいアニメーションを作成する場合は()あなたは次の2、#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();
animate変数はプロトタイプを継承しませんが、
console.log(9, typeof ani2.bark);
console.log(10, typeof animate.bark);
アニメーション変数に直接適用されたメンバーを継承しないことに注意してください。 animate.prototypeからのみ継承します。
animate.paperclip = function(){ console.log(11, "paperclip"); };
animate.paperclip();
console.log(12, typeof ani2.paperclip);
console.log(13, typeof animate.paperclip);
また新しい子供たちにインスタンスメンバーを追加するには、アニメーションのようなコンストラクタ関数内このキーワードを使用することができます。
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のメンバーは、同じ方法で「共同」ではありません。これらは、コンストラクタですぐに割り当てられました。new Anime()(Anime.prototypeから継承されません)。また、プロトタイプ上のaメンバは常にコンストラクタによって「個別化」されます。
新しいキーワードを忘れたり、そうでないようにする必要はありません。例えば、このは、という新しいなしで呼ばれるコンストラクタ内のグローバルオブジェクトを指します。
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);
ここに出力があります。トムがダグラス・クロックフォードのビデオを提案してくれたのは2番目です!
/*
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
*/
プロトタイプ継承(特にwrt JavaScript)について説明するもう一つの大きな答え:http://stackoverflow.com/questions/1595611/how-to-properly-create-a-custom-object-in-javascript/1598077#1598077 –
も参照してください。http://stackoverflow.com/questions/186244/what-does-it-mean-that-javascript-is-a-prototype-based-language –