这是一个深思熟虑的决定,早在2012年ES6开发时--你可以在the meeting notes on Maxmin class semantics页找到它:
Mark S. Miller:那么Foo
将继承Object.create
、Object.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.prototype
、Array.prototype
、Error.prototype
等都继承自Object.prototype
,但它们的构造函数不继承Object
.
早期的教程博客文章也证实了这一点,比如this one:
[当你]不延长:class Foo {}
Foo
的原型是Function.prototype
(就所有功能而言).
Foo.prototype
的原型是Object.prototype
.
这与函数的情况相同.请注意,上面的值并不等同于class Foo extends Object
,唯一的原因是您通常希望避免Foo
继承Object.create()
这样的方法.