最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

inheritance - Calling base constructor - Javascript - Stack Overflow

programmeradmin0浏览0评论

There are 2 ways to call the parent constructor in the child.

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;

Are there any situations when one would be safer/better than the other, or are they always equivalent?

There are 2 ways to call the parent constructor in the child.

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;

Are there any situations when one would be safer/better than the other, or are they always equivalent?

Share Improve this question edited Sep 16, 2013 at 16:39 Ilia Choly asked Nov 7, 2012 at 14:46 Ilia CholyIlia Choly 18.6k14 gold badges94 silver badges164 bronze badges 7
  • What would compel you to use the second version? You're just taking a long path to get to the same function. – I Hate Lazy Commented Nov 7, 2012 at 14:51
  • Maybe a situation where A inherited a constructor from another object? – Ilia Choly Commented Nov 7, 2012 at 14:58
  • Alright, but then the two calls are not equivalent. You're talking about two different situations. – I Hate Lazy Commented Nov 7, 2012 at 15:01
  • Hence the last part of the question. – Ilia Choly Commented Nov 7, 2012 at 15:02
  • But if you're describing a situation where they are not equivalent, then you already know they may not be not equivalent, so why ask the question? If the situation is such that you know they are equivalent, then what would compel you to use the second version? – I Hate Lazy Commented Nov 7, 2012 at 15:03
 |  Show 2 more comments

1 Answer 1

Reset to default 18

It's always better to use the base constructor directly for the following reasons:

  1. It's faster. The interpreter doesn't need to access prototype.constructor.
  2. It's safer. Consider the program below.

A inherits from C, but I forgot to set A.prototype.constructor back to A. So it now points to C. This causes problems in the constructor B if we use the second method:

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;
发布评论

评论列表(0)

  1. 暂无评论