[英]What is the difference between class X and class X extends Object in JavaScript?
我知道:
class X {…
那么, X
的构造函数不能调用super
,但是class Y extends Object {…
那么Y
的构造函数必须包含一个super
调用。 两者之间还有其他语义差异吗? 除了 class 和 function 主体(例如, String(X)
与String(Y)
的值)之外, X
和Y
或X.prototype
和Y.prototype
之间是否有任何可观察到的差异?
首先, “Y 的构造函数必须包含超级调用”的规则仅在您实际定义自定义构造函数时才成立。 但是,您可以在没有显式构造函数的情况下定义Y
正如您将看到的, X.prototype
是一个instanceof X
,而Y.prototype
是一个instanceof Y
。 通过定义一个构造函数(一个“类”),您总是隐式地创建一个(新的)原型 object,其constructor
属性设置为该构造函数。 很明显, X.prototype.= Y.prototype
。
但是,在原型链中向上一级,您会立即找到Object.prototype
,这意味着X
和Y
实例的原型链立即合并。 以下所有内容都显示为“true”:
class X {} class Y extends Object {} console.log(Object.getPrototypeOf(X.prototype) === Object.prototype); console.log(Object.getPrototypeOf(Y.prototype) === Object.prototype); console.log(Object.getPrototypeOf(X.prototype).constructor === Object); console.log(Object.getPrototypeOf(Y.prototype).constructor === Object);
构造函数的原型链仍然存在差异(因此不是构造对象或原型对象,而是 function 对象本身); Y
的链中有一个额外的级别,它代表Object
。 同样,所有这些都打印“真”:
class X {} class Y extends Object {} console.log(Object.getPrototypeOf(X) === Function.prototype); console.log(Object.getPrototypeOf(Object.getPrototypeOf(Y)) === Function.prototype); console.log(Object.getPrototypeOf(Y) === Object); // Object is missing in the proto chain of X
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.