调用基础构造函数 - Javascript

时间:2012-11-07 14:46:31

标签: javascript inheritance prototype

有两种方法可以调用子节点中的父构造函数。

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;

是否存在任何一种比另一种更安全/更好的情况,或者它们总是相同的情况?

1 个答案:

答案 0 :(得分:17)

最好直接使用基础构造函数,原因如下:

  1. 它更快。口译员无需访问prototype.constructor
  2. 更安全。请考虑以下计划。
  3. A继承自C,但我忘记将A.prototype.constructor设置回A。所以它现在指向C。如果我们使用第二种方法,这会导致构造函数B出现问题:

    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;