null
合法:class foo extends null {}
new foo();
通过一些搜索发现,在ES Discuss上有人建议这样的声明应该被视为错误;然而,其他评论者则认为这样的声明应该保持合法,理由是:
最终,对这个争论的那一方获胜了。某些人可能想创建一个具有
{__proto__: null}
原型的类
我对这个假设使用案例感到很困惑。首先,虽然这种类的声明是合法的,但似乎以这种方式声明的类无法实例化。在 Node.js 或 Chrome 中尝试实例化上述的 `foo` 类会给出一个非常愚蠢的错误信息:
而在 Firefox 中进行相同操作会得到:TypeError: function is not a function
在这个特性的 MDN 当前示例中,为类定义一个构造函数也没有帮助;如果我尝试实例化这个类:TypeError: function () {
} is not a constructor
class bar extends null {
constructor() {}
}
new bar();
然后Chrome/Node告诉我:
ReferenceError: this未定义
而Firefox告诉我:
ReferenceError: |this|在bar类构造函数中未初始化使用
这是什么疯狂的事情?为什么这些扩展了null的类不能被实例化?既然它们不能被实例化,为什么规范中还故意保留了创建它们的可能性?为什么一些MDN作者认为这值得记录呢?这个特性有什么可能的用途?
constructor
返回Object.create(null)
作为替代方案。这显然可以避免自动调用super
。https://jsfiddle.net/w7y2mbcd/ 但我猜它实际上不是该类的成员。 - user1106925Object.create(bar.prototype)
。https://jsfiddle.net/w7y2mbcd/1/ - user1106925Map
之前,这更加重要,因此他们会使用Object.create(null)
作为通用映射来保存不预先知道的任意属性,以便你可以保证任何属性查找都来自于与对象的交互而不是默认继承。现在似乎不那么重要了,但另一方面可能仍然存在一些用例。虽然不知道它们是什么。 - user1106925super
。但是我也没有认真思考过这个问题。 - user1106925extends
后面可以跟任何LeftHandSideExpression,这基本上意味着任何可以放在=
左边的东西都可以。这包括像foo()
和null
这样的东西。现在,null = 42;
和foo() = 42
都没有意义,但它们是有效的,并且会抛出运行时错误。另一方面,class Foo extends bar() {}
是有意义的。编辑:嗯,foo() = 42
和null = 42
似乎是早期错误,几乎像语法错误:-/ - Felix Kling