使用Object.assign()克隆实例是否有危险?

时间:2018-09-20 06:17:13

标签: javascript class clone

我希望扩展Node.js中的当前类以向其添加promise属性:

import { spawn } from 'child_process' 

const cp = spawn('echo', ['hello world'])
cp.promise = new Promise((r, j) => cp.on('exit', r).on('error', j))

但是,IDE不会选择promise属性来获取建议和自动完成功能。

如果我创建了一个类并扩展了获得原始实例时所得到的对象的原型,则IDE可以正常工作:

class ChildProcessWithPromise extends ChildProcess {
  constructor(p, promise) {
    super()
    this._promise = promise
    Object.assign(this, p)
  }
  /**
   * @type {Promise.<PromiseResult>} The promise resolved when the process exits.
   */
  get promise() {
    return this._promise
  }
}

是否有这样做的危险,以致在某个时间点其中一种方法可以访问旧的this?我已经使用此设置对其进行了检查,它似乎可以正常运行:

const { EventEmitter } = require('events')

class Test extends EventEmitter {
  constructor(n, t) {
    super()
    this._n = n
    if (t) Object.assign(t)
  }
  run() {
    this.emit('data', this._n)
  }
}

const t = new Test(1)
t.on('data', d => console.log('t %s', d))

const t2 = new Test(2, t)
t2.on('data', d => console.log('t2 %s', d))

t.run()
t2.run()

结果(正确):

t 1
t2 2

但是,我想看看是否有人能想到可能导致意外行为的情况。将函数绑定到方法内部时的提示行。

0 个答案:

没有答案