通过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开销或其他值得的东西?
答案 0 :(得分:1)
没错,但不需要。通常使用这些模式,因此不会污染全局范围。
在ES6中,每个文件都是一个模块,只有您明确导出的文件才可用于外部。该文件中定义的任何其他内容仅在该文件中可用,并且不会污染全局范围。
同样,Slava指出,当转换到ES5或更低版本时,TypeScript会为您完成。
答案 1 :(得分:1)
如果你去这里:Typescript Playground,你可以看到打字到javascript时打字稿实际上做了相同的模式,所以在Typescript中不需要它
更新: 或者使用定义模块的导出方法:Typescript Playground