为什么在JavaScript继承中使用新的SuperClass()是错误的?

时间:2014-07-29 03:45:13

标签: javascript oop inheritance

Mozilla's Guide中的第25行。它说使用等同于

的代码是错误的
SubType.prototype = new SuperType();

我有点认为,如果需要参数,你不能在没有任何参数的情况下调用new SuperType() ......但实际上并不是因为JavaScript中没有函数签名。不应该在没有任何参数的情况下调用new SuperType()只会导致参数为undefined?我想这可能会导致错误。

更重要的是,该指南说明使用SubType.prototype = new SuperType();的原因还有其他原因。它们是什么?

3 个答案:

答案 0 :(得分:1)

大多数情况下,构造函数不会像分配传递的值那样简单。有时构造函数会对传递的数据执行一些操作,以使新对象处于理想状态。在这种情况下,对undefined的定义会非常糟糕。

我会说这是一个不好的做法,因为这会使对象处于无效状态开始。当你的超级类型处于无效状态时,所有子类型也将无效。

当您想在对象之间建立关系时,使用Object.Create始终是一个好习惯

答案 1 :(得分:0)

参见此处的工作

function name(h,b) { this.h = h; this.b = b; }

function shape(x,y) { this.x = x; this.y = y; }

name.prototype = new shape(1,2);

name.prototype.x // prints 1

答案 2 :(得分:0)

prototype是Object的一个属性 - 基础对象,每个JS对象都继承自Object。 Object.prototype用于包含继承的所有方法和属性。但是JS中的Inherited并不像其他语言一样继承,在JS中我们应该理解它是Inherited = Shared。在Inherited树中,它们(对象)在框中共享属性和方法是.prototype

然后你不应该使用SubType.prototype = new SuperType()。此语句将覆盖Object()的基础.prototype,创建新框,其中包含另一个已分配的内存,而不与其他对象共享。这个问题会导致严重的性能,在JS中继承(共享)是非法的。