ES6工厂模式未定义

时间:2015-08-17 19:01:14

标签: javascript design-patterns scope ecmascript-6

我正熟悉ES6并在Javascript中为实时项目实现设计模式。我有以下示例代码段,它会抛出一个错误,指出 this 关键字的计算结果为undefined:

export let LifecycleFactoryObj = (() => {
  this.myCollection = new WeakSet();
  //.... More here
  this.add = function (opts) {
    let tempObject = new MyCollection(opts);
    this.myCollection.add(tempObject);
    if (this.myCollection.has(tempObject)) {
      return tempObject;
     }
    return null;
  };
})();

引发的错误是:

  

undefined.lifecycles = new WeakSet();                          ^ TypeError:无法设置未定义的属性'lifecycles'

看起来IIFE中的正在评估 undefined ,但我似乎无法追查原因。我认为当使用进行变量实例化时,ES6正确地确定了这个关键字的范围。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您不使用构造函数或者没有对象,则在ES6中未定义

this;您需要使用传统语法(function ClassName)或新语法(class ClassName)来创建构造函数,然后调用该构造函数。

在你的情况下,似乎不需要一个完整的类,所以尝试使用普通对象:

export let LifecycleFactoryObj = {
    myCollection: new WeakSet(),
    //.... More here
    add: function(opts) {
        let tempObject = new MyCollection(opts);
        this.myCollection.add(tempObject);
        if (this.myCollection.has(tempObject)) {
            return tempObject;
        }
        return null;
    }
};