有两种方式调用子构建器中的父构造函数.
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;
有什么情况下,一个人会比另一个更安全/更好,还是总是等同的?
解决方法
直接使用基础构造函数总是更好,原因如下:
>更快解释器不需要访问prototype.constructor.
>更安全考虑下面的程序
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;