我可以使用Object.assign创建一个"类"

时间:2016-12-01 06:45:42

标签: javascript

我目前在这里有一些代码:

let loginWindow = Object.assign({}, EventEmitter.prototype, {
  window: null,
  create: () => {
    // Load LoginWindow Settings
    Settings.get("loginWindowState")
    .then((state) => {
      if (state === undefined) state = {};
      loginWindow.window = new BrowserWindow({
        x: state.x || 0,
        y: state.y || 0,
        width: state.width || 600,
        height: state.height || 700,
        frame: false,
        show: false
      });
      if (_.isEmpty(state)) {
        loginWindow.window.center();
      }
      if (state.maximized) {
        loginWindow.window.maximize();
      }
      loginWindow.window.loadURL(`file://${__dirname}/../views/index.html`);
      loginWindow.window.on('closed', () => { loginWindow.window = null; });
      loginWindow.window.on('ready-to-show', () => loginWindow.window.show());
      loginWindow.window.on('move', rememberWindowState);
      loginWindow.window.on('resize', rememberWindowState);
      loginWindow.window.on('maximize', rememberWindowState);
      loginWindow.window.on('unmaximize', rememberWindowState);
    });
    loginWindow.emit("created");
  },
  close: () => {
    loginWindow.window.close();
  }
});

我用它来控制Electron项目中的窗口,虽然我似乎误解了它的构造。

没有this或者至少它在运行时返回undefined,我也说不出来

loginWindow.emit("created")来自其内部,但如果我要创建对象并从外部执行它就可以正常工作

我想在创建时使用事件发射器,但我已经替换了loginWindow.emit("created");

return Promise.resolve(true);

现在我知道它什么时候被创建了,但我觉得我应该能够在它的位置使用事件发射器。

1 个答案:

答案 0 :(得分:1)

Object.assign真的不是为此而设计的。而且,箭头函数不绑定自己的thisargumentssupernew.target。这就是为什么它会在你的情况下返回undefined。无论如何,这是我推荐的方法。

let loginWindow = new class extends EventEmitter{
  constructor(){
    super();
    this.window = null;
  }
  create(){
    // Load LoginWindow Settings
    Settings.get("loginWindowState")
    .then((state) => {
      if (state === undefined) state = {};
      loginWindow.window = new BrowserWindow({
        x: state.x || 0,
        y: state.y || 0,
        width: state.width || 600,
        height: state.height || 700,
        frame: false,
        show: false
      });
      if (_.isEmpty(state)) {
        this.window.center();
      }
      if (state.maximized) {
        this.window.maximize();
      }
      this.window.loadURL(`file://${__dirname}/../views/index.html`);
      this.window.on('closed', () => { loginWindow.window = null; });
      this.window.on('ready-to-show', () => loginWindow.window.show());
      this.window.on('move', rememberWindowState);
      this.window.on('resize', rememberWindowState);
      this.window.on('maximize', rememberWindowState);
      this.window.on('unmaximize', rememberWindowState);
    });
    this.emit("created");
  }
  close(){
    this.window.close();
  }
}