我发现我可以像这样扩展对象:
class MyObject extends Object {}
这和完全不扩展有什么区别吗,像这样:
class MyObject {}
我问这个的原因是因为我有以下 mixin:
const MapMixin = (Base = Object) => class extends Base {
static from(array) {
return new this(Object.assign(...array.map(([key, value]) => ({[key]: value}))));
}
map(...args) {
return this.constructor.from(this.entries().map(...args));
}
entries() {
return Object.entries(this);
}
};
这个 mixin 可以这样使用:
class MyObject extends MapMixin(MyBaseClass) {}
但是如果没有基类,我现在已经指定它将扩展 Object
作为默认值:
class MyObject extends MapMixin() {}
所以我想知道,这实际上是否与根本不扩展任何东西一样有效。
最佳答案
我不知道这里的其他答案是否清楚,但区别在于 static 继承。
在 class
关键字之前,JavaScript 中的继承一直非常关注实例继承。没有人(我见过)愿意经历让一个类/构造函数从父类(super class)/构造函数继承静态成员的麻烦。更不用说做到这一点的唯一方法是通过非标准的 __proto__
属性。
因此,当我们今天查看扩展另一个类的类时,我们会考虑继承如何在该类的实例之间进行。例如,扩展 Object
或根本不扩展任何内容都是相同的,因为实例将继承自 Object
作为基础。
class A {}
class B extends Object {}
let a = new A()
let b = new B()
// a.__proto__.__proto__ === b.__proto__.__proto__ === Object.prototype
但是可能还不清楚,或者不太清楚 extends
关键字的作用不仅仅是为实例设置继承。它还在类构造函数之间设置继承。所以对于上面的 B
,使用 extends
也意味着 Object.setPrototypeOf(B, Object)
在 B 的后台被调用。所以,例如:
class A {} // A constructor inherits nothing (is a basic Function type)
class B extends Object {} // B inherits from Object
// A.setPrototypeOf === undefined
// B.setPrototypeOf === Object.setPrototypeOf
B
,扩展了 Object
,继承了 Object
的所有静态方法,而 A
没有扩展任何东西,没有。
区别在于 B.prototype
(或 B.prototype.__proto__
)——实例继承自,和 B.__proto__
——类构造函数继承自什么。是否扩展 Object
不会影响 prototype
或实例继承自什么,但会影响类的 __proto__
或静态继承。
关于javascript - 在 javascript 中扩展 Object 与完全不扩展之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46786309/