不正确理解工厂功能

时间:2017-05-13 14:58:44

标签: javascript

我试图了解JavaScript中继承的差异。

现在我正在尝试将第一个代码更改为工厂函数(第二个代码)。但是如何在里面使用EventEmitter的方法呢?

我已经和这段代码搏斗了大约5个小时,而且我已经阅读了我在这个主题上可以找到的所有博客。因此,我们将非常感谢一些指导。

原型授权方式

var inherits = require('util').inherits;
var EventEmitter = require('events').EventEmitter;

module.exports = Clock;

function Clock() {

  if ( ! (this instanceof Clock)) return new Clock();
  this._started = false;

  EventEmitter.call(this);

}

inherits(Clock, EventEmitter);

Clock.prototype.start = function start() {

  var self = this;

  if (self._started) return;

  var tic = true;

  this._started = Date.now();

  self._interval = setInterval(function() {
    var event = tic ? 'tic' : 'toc';
    self.emit(event, self.time());
    tic = ! tic;
  }, 1000);
};

Clock.prototype.stop = function stop() {
  clearInterval(this._interval);
  this._started = false;
};

Clock.prototype.time = function() {
  return this._started && Date.now() - this._started;
};

连锁继承方式 - 工厂功能

var eventEmitter = require('events').EventEmitter;

const clock = () => {

  let started = false;

  let interval;

  //eventEmitter.call(this);

  self = {

    isStarted: function() {
      return started;
    },

    start: function() {
      let tic = true;

      if (started) return;
      started = Date.now();

      interval = setInterval(function() {
        let event = tic ? 'tic' : 'toc';
        this.emit(event);
      })

    },

  }

  return Object.assign({}, self, eventEmitter);
};


var clock1 = clock()

1 个答案:

答案 0 :(得分:0)

我写了

const EventEmitter = require('events').EventEmitter;

function clock() {
  let started = false;
  let interval;

  return Object.assign(new EventEmitter(), {
    isStarted() {
      return started;
    },
    start() {
      …
    }
  });
}

var clock1 = clock();
相关问题