javascript - 在 javascript 中扩展 Object 与完全不扩展之间有区别吗?

标签 javascript ecmascript-6

我发现我可以像这样扩展对象:

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/

相关文章:

javascript - 为屏幕而不是打印媒体切换 CSS 显示

javascript - 在 Spring Boot 和 Angular 之间处理 CORS 和 CSRF

javascript - 解构分配中的 Prop 可以就地转换吗?

javascript - 如何在 Meteor 1.4.x 中运行为 NodeJS v6 LTS ES2015 编写的模块?

reactjs - 用于在一个文件中导出模块的 es6 语法

javascript - Node.js:拆分代码的正确方法是什么?

javascript - Emberjs -Ember 条件破坏了 Jquery.需要简单修复

javascript - 更改路由时在 react.js 中获取一个非常神秘的消息

javascript - IE7中的jquery cross-fade翻转问题

javascript - 如何使用 ES6 API 重复一系列 Promise