Object.assign未按预期工作

时间:2015-12-18 21:09:52

标签: javascript node.js mongoose ecmascript-6

我有一个名为bookings的对象,在其中我有几个属性,我想用Object.assign进行扩展,如下所示:

let data = Object.assign(booking, {
  hiw: event.hiw[booking.locale],
  tip: event.tip[booking.locale],
  start: moment(event.start).format('L')
});

但是当我打印数据时,结果将是源(预订)中的相同对象,因此hiwtipstart将被忽略,但是......如果我试着这样做:

let data = Object.assign({}, {
  hiw: event.hiw[booking.locale],
  tip: event.tip[booking.locale],
  start: moment(event.start).format('L')
});

这将是完美的。

我的问题是:我在这里做错了什么?为什么我不能扩展booking而我可以扩展空对象?

对于异步代码来说,这绝对不是问题,当我尝试延长预订时,他已经存在所有属性。

我也尝试使用下划线extend方法,行为完全相同。

1 个答案:

答案 0 :(得分:8)

Mongoose文档(模型实例)很特殊:它们只会打印模式中存在的属性。

如果没有在那里定义属性,那么当你console.log()它们时它们就不会出现(如果你将文档转换为带有obj.toObject()的普通JS对象,它也不会出现)

这意味着只有在分配了架构中也存在的属性时才使用Object.assign()。任何未声明的属性都不会显示(也不会保存到数据库中)。

如果您打算将文档用于输出,则应在分配之前将其转换为正确的JS对象:

let data = Object.assign(booking.toObject(), {
  hiw   : event.hiw[booking.locale],
  tip   : event.tip[booking.locale],
  start : moment(event.start).format('L')
});