在Typescript中关闭类是不对的?

时间:2016-03-09 20:55:09

标签: typescript

通过The Guardian的Scribe Javascript库,我注意到他们正在使用他们在课堂附近关闭的模式。

我以前没见过这个,所以我希望从中学到一些东西。

以下是说明模式的简化示例:

define(function () {

  return function (scribe) {
    function CommandPatch(commandName) {
      this.commandName = commandName;
    }

    CommandPatch.prototype.queryState = function (value) {
      scribe.something();
    };

    return CommandPatch;
  };

});

这里,导出的函数在每次调用时生成一个新类(原型),每个调用绑定到scribe的不同实例。

如果我在Typescript中遵循这种模式,我可能会这样做:

export = function (scribe: Scribe) {
    return class CommandPatch {
        private commandName: string

        constructor (commandName: string) {
            this.commandName = commandName
        }

        queryState() {
            scribe.something();
        }
    }
}

我觉得这可能不是一个很好的模式吗?

这种模式会导致内存泄漏吗?

他们为什么这样做?只是为了避免输入this.scribe

如果我要遵循更传统的OO模式,我可能会这样做:

export class CommandPatch {
    private scribe: Scribe
    private commandName: string

    constructor (scribe: Scribe, commandName: string) {
        this.commandName = commandName
        this.scribe = scribe
    }

    queryState() {
        this.scribe.something();
    }
}

这样,只为同一个类创建了一个原型,而不是为Scribe的每个实例生成一个新原型。

这有更好还是更糟?

我是否节省了任何内存或CPU开销或其他值得的东西?

2 个答案:

答案 0 :(得分:1)

没错,但不需要。通常使用这些模式,因此不会污染全局范围。

在ES6中,每个文件都是一个模块,只有您明确导出的文件才可用于外部。该文件中定义的任何其他内容仅在该文件中可用,并且不会污染全局范围。

同样,Slava指出,当转换到ES5或更低版本时,TypeScript会为您完成。

答案 1 :(得分:1)

如果你去这里:Typescript Playground,你可以看到打字到javascript时打字稿实际上做了相同的模式,所以在Typescript中不需要它

更新: 或者使用定义模块的导出方法:Typescript Playground