1

このコードを考えると:

var SuperClass = function(a, b) {
  this.a = a;
  this.b = b;
};

SuperClass.prototype.getA = function() {
  return this.a;
};

var SubClass = function(a, b, c) {
  SuperClass.call(this, a, b);
  this.c = c;
};

プロトタイプを開始するためにSubClass、ほとんどの推奨事項は次のようです。

SubClass.prototype = new SuperClass();

のプロトタイプとして機能するためだけにSuperClass、(独自のaとプロパティを持つ) 新しいオブジェクトを作成 (インスタンス化) するのは奇妙に思えます。bSubClass

これも機能します:

// anti-pattern
SubClass.prototype = SuperClass.prototype;

SuperClass.prototypeただし、参照によってオブジェクトを渡すため、 に追加するものSubClass.prototypeはすべて にも追加されSuperClass.prototypeます。これらは同じオブジェクトであるためです。これは、ほとんどの場合、予期された動作ではありません。

質問:のベース プロトタイプSuperClassとして機能するのインスタンスを作成せずに、適切なプロトタイピングを行う方法はありますか?SubClass

4

2 に答える 2

5

最新のブラウザーでは:

SubClass.prototype = Object.create( SuperClass.prototype );

これにより、親クラスの「コンストラクター」メソッドを呼び出さに、定義済みのオブジェクトを作成できます。詳細については、(古いブラウザ用のポリフィル実装を含む) をお読みください。__proto__ Object.create

実際に見られる:

function Foo(){ console.log("AHHH!"); }
Foo.prototype.foo = 42;
function Bar(){}
Bar.prototype = Object.create(Foo.prototype);  // Note: no "AHHH!" shown
Bar.prototype.bar = 17;

// Showing that multi-level inheritance works
var b = new Bar;
console.log(b.foo,b.bar); //-> 42, 17

// Showing that the child does not corrupt the parent
var f = new Foo;          //-> "AHHH!"
console.log(f.foo,f.bar); //-> 42, undefined

// Showing that the inheritance is "live"
Foo.prototype.jim = "jam";
console.log(b.jim);       //-> "jam"
于 2012-05-23T23:33:24.523 に答える