【问题标题】:How to wrap a JS library with a function and put it into a namespace?如何用函数包装 JS 库并将其放入命名空间?
【发布时间】:2013-03-10 22:04:27
【问题描述】:

我在 JavaScript 中有一个 支付网关 API 包装器

但它的设计很糟糕。

它使用 163 个全局(窗口)对象

我想做的是

获取 API 包装器生成的所有全局对象

将它们全部放在一个名为“PG”的对象中。


所以我可以使用它的方法

PG.methodName()

获取变量

PG.variableName


我怎样才能用 JavaScript 做到这一点?

或者还有其他方法可以加载带有命名空间的脚本吗?


这里是有问题的 JS 库:See Gist

【问题讨论】:

  • 哇,有很多粗体字!那么,代码看起来如何?你能把它包括进去吗?
  • @Stefan 我编辑了我的问题以包含 JS 库
  • 是您的图书馆在window. 上添加内容还是“只是”缺少vars ?
  • @user1737909 这不是我的图书馆 :( 但它在global scope 中使用vars

标签: javascript oop namespaces global-variables encapsulation


【解决方案1】:

您可以创建一个虚拟 javascript 对象并向其添加函数和变量,如下所示:

var PG = PG || {};
PG.methodName = apiMethodName;
PG.variable = variableName;

这种方法将在PG 范围内创建它们的副本,同时将原始函数留在window 范围内。为了将它们从全局范围中移出,您必须自己修改 api 脚本,这可能不是一个好主意。

【讨论】:

    【解决方案2】:

    您正在寻找closure

    使用“Immediately-Invoked Function Expression”(也称为“自执行匿名函数”)来包装和执行您的代码;

    (function( window, document, NS, undefined ){
    
      NS.variableName = "string value";
      NS.methodName = function() {};
    
      function myFunction() { alert('within closure'); };
    
    }( window, window.document, (window.NS = window.NS || {}) ));
    

    然后您可以从闭包外部访问NS,但不能访问仅限于闭包范围的函数myFunction

    是的,您可以将 NS 重命名为 PG 甚至 PayGate :)

    【讨论】:

    • 如果你想使用 API 来管理你的命名空间,你应该从 mckoss 中查看 namespace.js:link
    • 是的,我熟悉namespace.js。它非常适合创建更大的命名空间,但在这种情况下并不是必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 2018-10-05
    • 2023-03-08
    • 2017-01-28
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多