是否适合将原型设置为另一个构造函数的实例?

时间:2014-07-15 16:47:38

标签: javascript inheritance

将以下内容视为一种继承更为常见:

function A() {}
function B() {}
B.prototype = A.prototype;

但以下是否合适?如果是这样,对于什么用例?

function A() {}
function B() {}
B.prototype = new A();

3 个答案:

答案 0 :(得分:1)

在第一个B.prototype = A.prototype;中,您将它们设为同一个对象,因此对A的更改也会更改B. 第二个B.prototype = new A();是如何通过使B成为A的实例来继承原型。

答案 1 :(得分:1)

第一种情况很不寻常。实例和B实例将具有完全相同的继承层次结构。它等同于为同一个类提供两个不同的构造函数。

我认为第二种用法更为典型。例如,当您使用util.inherits时,它几乎就是Node.js所做的。

现代JS(ES6)的更新:

您不应该使用new A(),而应使用Object.create(A.prototype)。当您使用new A()时,会发生一些您 想要的事情:即使没有A或{{A,您也会全局调用B构造函数1}}实例永远被创建。您应该已经在A构造函数中调用B父构造函数。召唤一个额外的时间毫无意义,有时可能无法按预期工作。

答案 2 :(得分:0)

还有其他答案,但有一个原因可能是:

function A() {}
function B() {}
function C() {}

B.prototype = new A();
C.prototype = new A();