无法使用 Object.assign 获取文档按键事件

Cannot get document keydown events with Object.assign

我正在使用

sources.DOM.select('document').events('keydown')
  .map(ev => Object.assign({}, ev, {type: 'keydown'}))

但是生成的流给出的对象只有 "isTrusted" 属性(而不是 "key"、"code" 等)。相反,使用 'mousemove' 我得到了预期的事件(使用 "isTrusted" 但也有 "movementX"、"movementY" 等)。怎么了?

你是对的,不是Cycle.js problem but rather a limitation of Object.assign

简单地说——Object.assign不复制继承的属性。

This answer on a similar problem 提供了一个可行的替代方案:

function main (sources) {
  const vdom$ = sources.DOM.select('document').events('keydown')
    .map(ev => cloneEvent(ev))
    .map(mykey => div('Key pressed: ' + mykey.key + ', code:' + mykey.code))
    .startWith(div('Press a key.'))

  return {
    DOM: vdom$
  }
}

function cloneEvent(e) {
  if (e===undefined || e===null) return undefined;
  function ClonedEvent() {};  
  let clone=new ClonedEvent();
  for (let p in e) {
    let d=Object.getOwnPropertyDescriptor(e, p);
    if (d && (d.get || d.set)) Object.defineProperty(clone, p, d); else clone[p] = e[p];
  }
  Object.setPrototypeOf(clone, e);
  return clone;
}

查看更新 codepen.io example

这些 SO 问题和答案也有助于澄清情况: