javascript - 使用 Object.assign 和 class/extends 有什么区别?

标签 javascript ecmascript-6 flux

我试图通过查看其 flux chat example 的源代码来了解 Facebook Flux 的工作原理.

在那里,我看到了this code :

var MessageStore = assign({}, EventEmitter.prototype, {

  emitChange: function() {
    this.emit(CHANGE_EVENT);
  },

  /**
   * @param {function} callback
   */
  addChangeListener: function(callback) {
    this.on(CHANGE_EVENT, callback);
  },
  ...
}

...

module.exports = MessageStore;

...其中 allocate 只是 ES6 规范中的 Polyfilled Object.assign。

嗯。这段代码使用类和扩展代替可以工作吗?意思是一样的吗?这种方法有什么区别和优点/缺点?

class MessageStore extends EventEmitter {
    emitChange() {
        this.emit(CHANGE_EVENT);
    }

    addChangeListener(callback) {
        this.on(CHANGE_EVENT, callback);
    }

    ...
}

module.exports = new MessageStore();

我问这个问题是因为,来自其他语言,我直观地理解类/扩展,而基于原型(prototype)的继承对我来说总是有点不清楚。

最佳答案

以下是您可以根据 ES6 语法和您的情况使用的工作代码:

import EventEmitter from 'events';
const CHANGE_EVENT = 'change';

class MessageStore extends EventEmitter {

  constructor() {
    super();
  }

  addChangeListener = (callback) => {
    this.on(CHANGE_EVENT, callback);
  }

  removeChangeListener = (callback) => {
    this.removeListener(CHANGE_EVENT, callback);
  }

  emitChange = () => {
    this.emit(CHANGE_EVENT);
  }

}

注意,我更喜欢 ES6 函数文字语法,因为它确保“this”始终绑定(bind)到封闭的对象上下文。

有关完整运行的 ES6 商店示例,请随时查看 stores code in my Babel React Starter App

这也是 ES6 classes 的有用引用。它直观地解释了类定义体内发生的事情。

关于javascript - 使用 Object.assign 和 class/extends 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34561349/

相关文章:

javascript - Chai: AssertionError: expected [Function] 是一个函数(测试异常时)

javascript - XMLHttpRequest 更改 UTF-8 中的文本

java - 创建 Flux.fromIterable 后如何运行 onClose 操作?

java - 如何在可迭代的 Spring Boot Flux 中延迟发出每个项目

javascript - 查找页面上的元素数量 (JQuery)

javascript - 描述关键字 let、const 和 var 的术语是什么?

javascript - 在 Aurelia 中注入(inject)多个使用 fetch HttpClient 的类

javascript - 如何将对象数组转换为对象列表

javascript - 通量和 WebSocket

javascript - 仅使用 CSS 在智能手机上实现分页(无 Javascript/JQuery)