B.prototype.b
あなたが推測するように、静的プロパティを作成しません。それよりも少し複雑です。プロトタイプにアタッチされたプロパティは、その値を上書きするまで、その値を他のインスタンスと共有します。つまり、次のようになります。
var Foo = function(){
};
Foo.prototype.bar = 'bar';
var f1 = new Foo();
console.log( f1.bar ); //outputs 'bar'
var f2 = new Foo();
console.log( f2.bar ); //outputs 'bar'
f2.bar = 'notbar';
console.log( f2.bar ); //outputs 'notbar'
console.log( f1.bar ); //outputs 'bar'
「本物の」静的プロパティを持つ唯一の方法は、それらをコンストラクタ関数自体にアタッチすることです。
Foo.bar2 = 'bar2';
のインスタンスは、 でFoo
その値にアクセスする必要がありますFoo.bar2
。
したがって、あなたの質問に対する答えは、グループごとに「サブクラス」(基本コンストラクター関数からプロトタイプを継承するコンストラクター関数) を作成し、次のようにサブクラスごとにプロパティをアタッチすることです。
var Base = function(){
};
Base.prototype.getSomething = function(){
return this.constructor.something;
};
Base.prototype.setSomething = function( value ){
this.constructor.something = value;
}
var Group1 = function(){
};
Group1.prototype = new Base(); //classical inheritance
Group1.prototype.constructor = Group1;
Group1.something = 'something';
var Group2 = function(){
};
Group2.prototype = new Base(); //classical inheritance
Group2.prototype.constructor = Group2;
Group2.something = 'something else';
var g1a = new Group1();
var g1b = new Group1();
var g2a = new Group2();
var g2b = new Group2();
g1a.setSomething( 'whatever' );
console.log( g1a.getSomething() ); //outputs 'whatever'
console.log( g1b.getSomething() ); //outputs 'whatever'
console.log( g2a.getSomething() ); //outputs 'something else'
console.log( g2b.getSomething() ); //outputs 'something else'
警告:Group1.prototype = new Base();
実際には悪い習慣です。数日前に 3 種類の継承に関するブログ記事を書きましたが、その理由を説明しています。
http://creynders.wordpress.com/2012/04/01/demiurge-3-types-of-javascript-inheritance-2/