行为授权方法之间的差异

时间:2016-11-03 02:53:29

标签: javascript

有没有人可以解释在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!

1 个答案:

答案 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也可能是一个很好的来源。