【问题标题】:Static import in Javascript without 'with'Javascript中的静态导入没有'with'
【发布时间】:2014-12-30 23:00:46
【问题描述】:

上下文:我为自己编写了一个迷你 JS 库,它只是常用类的集合。我遵循 IIFE (http://benalman.com/news/2010/11/immediately-invoked-function-expression/) 技术将我的代码分成模块/类,它们都分组在一个通用的全局命名空间 var 下。我们称之为ns。所以我们有一个典型的设置,ns.ClassAns.ClassB 等。另一方面,现在在运行时加载一个单独的脚本 (main.js) 并附加到文档中,这个 main.js 包含实际代码使用这些类。

目标:我试图找到一种优雅的方式,通过调用类名直接访问 main.js 中的类,而不必通过 ns 访问它们。 .例如,我希望能够做到var a = new ClassA();而不是var a = new ns.ClassA();

研究和考虑的解决方案:

1) 可怕的 'with' 关键字 (javascript "static imports")。在这种情况下,我会做类似 with(ns){ var a = new ClassA()} 的操作,但我必须将整个 main.js 包装在 with(ns) 语句中。出于显而易见的原因,这是不可取的。

2) 使用本地声明的变量。

var ClassA = ns.ClassA, ClassB = ns.ClassB; 然后,我将能够直接实例化 ClassA 和 ClassB。但是,这种方法需要我手动维护声明,并且随着包中类数量的增加,它会变得非常混乱且难以维护。

3) 通过注入污染全局作用域

使用for 循环遍历ns 并将ns 内的所有类映射到全局范围。这显然是不可取的,而且还会为 ns.Event、ns.Audio 等情况造成冲突。

4) PaperScript 风格 (http://paperjs.org/tutorials/getting-started/working-with-paper-js/)

灵感来自 PaperJS 的 PaperScript,PaperScript code is automatically executed in its own scope that without polluting with the global scope still has access to all the global browser objects and functions, such as document or window. 在 GitHub 上查看他们的源代码(抱歉,我不会再发布任何链接),他们似乎使用了一些自定义脚本预处理,然后是 Acorn.js解析。最终结果是可以直接引用paper 对象中的任何类。例如,var path = new Path() 而不是var path = new paper.Path(),这正是我想要实现的。但是,我担心实现这样一个简单的功能似乎需要做太多的工作。所以想看看有没有人有什么想法?

感谢您抽出宝贵时间阅读此问题的详细说明。任何意见表示赞赏。

注意:这两天我已经尽了最大的努力来研究这个话题,如果我错过了任何明显的解决方案,请原谅我。此外,如果没有简单的解决方案,我将坚持使用ns.ClassA 模式。感谢您的帮助!

【问题讨论】:

  • 选择你最喜欢的那个,或者把它全部扔掉,只用Require。这将被关闭为“主要基于意见”。
  • 感谢您的回复。我想知道除了我列出的解决方案之外是否还有其他替代解决方案?
  • 每个问题都有很多解决方案;自然问题which solution is best 没有价值。
  • 我很抱歉没有说清楚。事实上,“哪种解决方案是最好的”性质的问题主要是基于意见的,这不是这里要问的问题。从问题本身可以看出,我已经为自己评估和评估了每个解决方案。我只是想知道我是否忽略了其他可能的解决方案。感谢您的意见和关注。

标签: javascript with-statement


【解决方案1】:

我不是专家,但我相信你可以创建一个 String 的原型并像这样设置你的变量

String.prototype.ns = function(){
    return new ns[this]();
}
var ca = "ClassA".ns();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    相关资源
    最近更新 更多