使用 Object.assign 和 class/extends 有什么区别?
What are the differences between using Object.assign and class/extends?
我试图通过查看其 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;
...其中分配只是 ES6 规范中的 polyfill Object.assign。
嗯。这段使用 类 并改为扩展的代码是否有效?意思是一样的吗?这种方法有什么区别和advantages/disadvantages?
class MessageStore extends EventEmitter {
emitChange() {
this.emit(CHANGE_EVENT);
}
addChangeListener(callback) {
this.on(CHANGE_EVENT, callback);
}
...
}
module.exports = new MessageStore();
我问,因为来自其他语言,我直观地理解class/extends,而基于原型的继承对我来说总是有点不清楚。
以下是您可以根据 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" 始终绑定到封闭对象上下文。
如需完整的 ES6 商店示例,请随时查看 stores code in my Babel React Starter App
这也是对 ES6 classes 的有用参考,直观地解释了 class 定义的主体内部发生的事情。
class 扩展:*
您正在扩展一个通用的 class,这有时正是您想要的,例如button
扩展了 domElement
,但是 button
不应该扩展 EventEmitter
,因为它们没有任何共同点。
Object.assign:
使用 Object.assign 你是 "mixin" 目标对象的新功能,例如Store
可能会混入 EventEmitter
。在 Java 中,您将使用 Store implements EventEmitter
,这更容易自我解释。
我试图通过查看其 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;
...其中分配只是 ES6 规范中的 polyfill Object.assign。
嗯。这段使用 类 并改为扩展的代码是否有效?意思是一样的吗?这种方法有什么区别和advantages/disadvantages?
class MessageStore extends EventEmitter {
emitChange() {
this.emit(CHANGE_EVENT);
}
addChangeListener(callback) {
this.on(CHANGE_EVENT, callback);
}
...
}
module.exports = new MessageStore();
我问,因为来自其他语言,我直观地理解class/extends,而基于原型的继承对我来说总是有点不清楚。
以下是您可以根据 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" 始终绑定到封闭对象上下文。
如需完整的 ES6 商店示例,请随时查看 stores code in my Babel React Starter App
这也是对 ES6 classes 的有用参考,直观地解释了 class 定义的主体内部发生的事情。
class 扩展:*
您正在扩展一个通用的 class,这有时正是您想要的,例如button
扩展了 domElement
,但是 button
不应该扩展 EventEmitter
,因为它们没有任何共同点。
Object.assign:
使用 Object.assign 你是 "mixin" 目标对象的新功能,例如Store
可能会混入 EventEmitter
。在 Java 中,您将使用 Store implements EventEmitter
,这更容易自我解释。