11

子で親コンストラクターを呼び出す方法は 2 つあります。

var A = function A() {
  this.x = 123;
};

var B = function B() {

  // 1. call directly
  A.call(this);

  // 2. call from prototype
  A.prototype.constructor.call(this);
};

B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;

一方が他方よりも安全/優れている状況はありますか、それとも常に同等ですか?

4

1 に答える 1

18

次の理由から、基本コンストラクターを直接使用することをお勧めします。

  1. それは速いです。通訳者はにアクセスする必要はありませんprototype.constructor
  2. より安全です。以下のプログラムを検討してください。

Aから継承しますが、に戻すのをC忘れました。つまり、を指します。2番目の方法を使用すると、コンストラクターで問題が発生します。A.prototype.constructorACB

var C = function C() {
    // some code
};

var A = function A() {
  this.x = 123;
};

A.prototype = Object.create(C.prototype);
// I forgot to uncomment the next line:
// A.prototype.constructor = A;

var B = function B() {

  // 1. call directly
  A.call(this);

  // 2. call from prototype
  A.prototype.constructor.call(this); // A.prototype.constructor is C, not A
};

B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;
于 2012-11-07T14:50:07.900 に答える