Есть ли опасность клонирования экземпляра с помощью Object.assign ()? - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу, чтобы мое расширение текущего класса в 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))

Однако свойство promise не будет выбрано в среде IDE для предложенийи автозаполнение.

Если я создаю класс и расширяю прототип объекта, который получаю при получении исходного экземпляра, среда 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

Однако я хочу посмотреть, может ли кто-нибудь придумать ситуациючто может привести к неожиданному поведению.Что-то строка, когда функция была связана внутри метода.

...