在JavaScript中,如果我使用静态方法创建一个类,然后创建该类的子类,我也可以使用子类名调用该静态方法(静态方法是继承的).

对象类是所有类的超类,它有许多静态方法. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object个 但是为什么这些方法都不能使用任何子类名称来调用呢?

更新: 我注意到一些人建议明确地‘extendObject. 但对象类已经是Java中每个类的超类..toString()方法证明了来自每个类的每个对象都有它,并且我们知道它是从Object类继承的,即使您没有显式地写出‘扩展对象’. 所以每个类都隐式地扩展对象(直接或通过继承链),但为什么自动继承非静态方法,而不是静态方法?

至于示例代码:

class Test {
  constructor() {}
}

const test = new Test();
console.log(test.toString()); // works, inherited from Object class
console.log(Test.<any static method of Object>)); // doesn't work

推荐答案

这是一个深思熟虑的决定,早在2012年ES6开发时--你可以在the meeting notes on Maxmin class semantics页找到它:

Mark S. Miller:那么Foo将继承Object.createObject.getOwnPropertyDescriptor等?

Dave Herman:这确实意味着我们在向对象添加方法时会受到越来越多的阻碍

[…]

Mark S. Miller:用Object中的所有元素污染静力学是致命的;这些与大多数类抽象无关 人们写;当我写class Point { }的时候,我不想 一百零二

Allen Wirfs-Brock:如果是class Point extends Object,你只能 Select 加入;如果是class Point { },你什么都得不到

[…]

Yehuda Katz:还有污染的重写危险:如果有人冻结Object,那么您将无法重写像keys()这样的甜蜜类方法名称,因此避免污染的能力很重要

我很高兴他们 Select 了这种行为.注意,不继承类(构造函数)对象-在ES5中很常见-也在表中,这意味着在子类上使用动态this调用静态方法将是相当尴尬的.(请注意,当时没有用于方法定义的static修饰符,静态方法是由简单的Foo.method = function() { … };赋值创建的).

Object的"静态方法"从来都不是(现在也不是)动态的,它们既不使用接收器(this),也不期望在"子类"上被调用.Object实际上只是一个用于处理对象的最基本工具(内部函数)的命名空间.当调用Test.create()时,人们会期望它创建一个新的测试,而不需要一个原型对象作为参数.

这会很奇怪的另一个原因是,当一个类从另一个类继承时,包括Object,它的constructor必须调用super().不打算使用任何继承的简单类不应该处理这一问题.因此,class没有extends子句的情况已经得到了不同的处理,重点放在可用性上,因为它是最常见的用法.不让这些类对象继承Object只是另一个特性.

最后,它遵循其他内置"类"的先例.Function.prototypeArray.prototypeError.prototype等都继承自Object.prototype,但它们的构造函数不继承Object.

早期的教程博客文章也证实了这一点,比如this one:

[当你]不延长:class Foo {}

  • Foo的原型是Function.prototype(就所有功能而言).
  • Foo.prototype的原型是Object.prototype.

这与函数的情况相同.请注意,上面的值并不等同于class Foo extends Object,唯一的原因是您通常希望避免Foo继承Object.create()这样的方法.

Javascript相关问答推荐

在JS中转换mysql UTC时间字段?

react 页面更改类别时如何返回第0页

使用CDO时如何将Vue组件存储在html之外?

当promise 在拒绝处理程序被锁定之前被拒绝时,为什么我们会得到未捕获的错误?

如何避免移动设备中出现虚假调整大小事件?

按钮未放置在html dis位置

在React中获取数据后,如何避免不必要的组件闪现1秒?

使用续集和下拉栏显示模型属性

网页自检测外部元素无法加载

分层树视图

您能在卸载程序(QtInsteller框架)上添加WizardPage吗?

如何将innerHTML字符串修剪为其中的特定元素?

如何在箭头函数中引入or子句?

元素字符串长度html

Nextjs 13.4 Next-Auth 4.2登录(&Quot;凭据&,{});不工作

在SHINY R中的嵌套模块中,不能使用Java代码

传递方法VS泛型对象VS事件特定对象

如何在一个对象Java脚本中获取不同键的重复值?

如何压缩图像并将其编码为文本?

设置复选框根据选中状态输入选中值