繁体   English   中英

class X 和 class X 扩展 Object 之间的区别是什么?

[英]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)的值)之外, XYX.prototypeY.prototype之间是否有任何可观察到的差异?

首先, “Y 的构造函数必须包含超级调用”的规则仅在您实际定义自定义构造函数时才成立。 但是,您可以在没有显式构造函数的情况下定义Y

正如您将看到的, X.prototype是一个instanceof X ,而Y.prototype是一个instanceof Y 通过定义一个构造函数(一个“类”),您总是隐式地创建一个(新的)原型 object,其constructor属性设置为该构造函数。 很明显, X.prototype.= Y.prototype

但是,在原型链中向上一级,您会立即找到Object.prototype ,这意味着XY实例的原型链立即合并。 以下所有内容都显示为“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM