在javascript中创建一个全局库,同时保存状态和行为

时间:2016-02-12 15:26:14

标签: javascript encapsulation

我想在Javascript中创建一个全局可访问的库myLib。我的图书馆应该执行以下操作

  • 保留一个有点持久的变量myLib.tax。

    - 它应该通过处理典型的浏览器用户事件而存在,至少在简单的情况下如此。我不在乎它是否存活的时间长于此。

    - 外部代码应该能够通过设置器或其他方式设置此变量的值。

  • 有一个函数myLib.applyTax(var price)。

    - 返回值为price + myLib.tax。

    - 如果价格或税收不是数字,我不在乎它做什么。

  • 最后,一个简短的例子,说明如何从另一个文件中调用它,以这种方式:

    - 例如,文件A可能设置税的值,然后文件B可能应用。

    - 即使文件A和B不相关也可以。

这个问题的目的是让我理解代码和状态封装以及如何在其他地方使用它们。

编辑:为了以后看到这个的人的利益,在提出这个问题时我不明白的是从javascript文件A.js引用到javascript文件B.js是一个难题除非在外部启用,例如在html中。有关更多详细信息,请参阅How do I include a JavaScript file in another JavaScript file?

1 个答案:

答案 0 :(得分:2)

根据您的评论,我看到您将通过静态方法和数据在C#中实现Singleton模式。

在Javascript中,您可以通过管理闭包并将数据放入最外层的数据来执行相同操作,然后由于词法范围,所有代码都可以访问这些数据。

但我宁愿每天避开单身人士。相反,使用依赖注入如下。这只是展示技术的一个示例,您必须自己编写实际解决方案。

var lex = (function () {
  var privatedata;

  function privatemethod()
  {
  }

  return {
    publicmethod1: function (arg1, arg2) { ... },
    publicmethod2: function (arg1, arg2) { ... },
    getPublicData: function () { ... }
  };
}());

然后在任何需要的地方注入这个封装的对象:

function consumerCode(lexicon)
{
  ...
}

consumerCode(lex); // injects the lex instance into the consumer code

通过只有一个实例并将相同的实例传递到您需要的任何地方,您将拥有您所要求的几乎所有内容。 这种技术不限于Javascript,但在C#中也很有用。但是在宽松打字的Javascript中它特别强大。