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

Create a global library in javascript, holding both state and behaviour

本文关键字:保存 状态 全局 创建 javascript 一个      更新时间:2023-09-26

我想用Javascript创建一个全局可访问的库myLib。我的库应执行以下操作

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

    - 它应该通过处理典型的浏览器用户事件来生存,至少在简单的情况下是这样。我不在乎它是否能存活更长的时间。

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

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

    -- 返回值是 price + myLib.tax。

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

  • 最后,一个简短的示例,说明如何从另一个文件调用它,方式如下:

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

    -- 即使文件 A 和 B 不相关,这也有效。

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

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

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

在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中,它特别强大。