0

オブジェクトごとに属性の個別の値が必要な場合は、次のようにコンストラクターで設定できます。

function A(x) {
    this.a = x;
}

特定の属性をオブジェクト間で共有したい場合は、コンストラクター関数のプロトタイプで設定できます。

function B() {}
B.prototype.b = 'B0';

しかし、その中間の状況で何をすべきか?基本的に、構築されたすべてのオブジェクトがプロトタイプからプロパティを継承する既存のコードがありますが、グループのすべてのメンバーが属性を共有するように、それらをいくつかのグループに分割する必要があります。

何とかコンストラクタ関数 B を特殊化する方法はありますか?

4

1 に答える 1

1

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/

于 2012-04-06T09:07:45.610 に答える