有没有人可以解释在Javascript(ES6 +)中组合对象的以下方式之间的差异?为什么以及何时应该使用另一个?我想知道支持和/或反对每种方法的论据。
'use strict';
const foo = {
say() {
console.log('I say', this.message);
}
};
const bar = {
message: 'Hoo!'
};
// Method 1
const baz = Object.assign({}, foo, bar);
baz.say();
// Method 2
const baz2 = Object.assign(Object.create(foo), bar);
baz2.say();
// Method 3
const baz3 = Object.create(foo);
baz3.message = 'Heey!';
baz3.say();
// Method 4
Object.setPrototypeOf(bar, foo);
bar.say();
// Prints out:
// I say Hoo!
// I say Hoo!
// I say Heey!
// I say Hoo!
答案 0 :(得分:0)
经过一番研究后,我想试着回答一下我自己的问题。
以上所有方法都举例说明了在Javascript中实现组合的方法。
方法1 使用Object.assign()
创建一种克隆或连接原型,通常称为 MIXIN 。没有经典的原型继承。
用于处理州数据或提供默认值。
在方法2 上,Object.create()
生成一个委托原型,在Object.assign()
之后使用其他属性进行扩展。在这里,结果对象的原型指向foo
。
适用于对象之间的共享功能和方法。
正如Felix Kling正确指出的那样,方法3 与其前身基本相同。
方法4 上的 Object.setPrototypeOf()
在此处的行为与Object.create()
相同,但不是创建新对象,而是更改了现有的bar
对象。
关于这个主题,“开源”丛书You Don't Know JS表达:
忽略
Object.create(..)
方法的轻微性能劣势(抛弃后来收集垃圾的对象),它比ES6 +方法更短,可能更容易阅读。但无论如何,它可能是一种语法冲洗。
为了更深入地分析这一点,this 2013 talk by Eric Elliot有很长的路要走。 His medium也可能是一个很好的来源。