gpt4 book ai didi

Javascript 命名空间——这是一个好的模式吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:37:01 24 4
gpt4 key购买 nike

目标...

  1. 从全局对象中删除变量、对象等。
  2. 消除碰撞的可能性。

首先,我实现了 Yahoo 命名空间代码(为了举例说明,我使用 ROOT 作为我的命名空间的根)...

        if (typeof ROOT == "undefined" || !ROOT) {
var ROOT = {};
}

ROOT.namespace = function () {
var a = arguments,
o = null,
i, j, d;
for (i = 0; i < a.length; i = i + 1) {
d = ("" + a[i]).split(".");
o = ROOT;
for (j = (d[0] == "ROOT") ? 1 : 0; j < d.length; j = j + 1) {
o[d[j]] = o[d[j]] || {};
o = o[d[j]];
}
}
return o;
}

现在我声明我的第一个命名空间...

ROOT.namespace("UI");

ROOT.UI = {
utc: 12345,
getUtc: function() {
return this.utc;
}
}

我想在这里做的是保存我的 UI 所需的变量(在本例中为 UTC 的当前时间),这样它们就不会出现在全局对象上。我还想提供一些特定的功能。这应该在每个页面上都可用,无需任何实例化......

现在我想在我的命名空间结构中存储一个对象。但是,这个对象需要多次创建。这里的目标是将其保留在我的结构中,但允许根据需要多次创建它。这是如下:

 ROOT.namespace("AirportFinder");
ROOT.AirportFinder = function(){
this.var1 = 99999;

this.Display = function() {
alert(this.var1);
}
}

这是实例化对象的示例代码...

        var test1 = new ROOT.AirportFinder();
test1.Display();

这是一个好的模式吗?

最佳答案

在命名空间 ROOT 或类似的东西上定义事物确实是合理的。

用闭包也比较好

(function() {
var AirportFinder = function() {
this.var1 = 99999;
this.Display = function() {
alert(this.var1);
}
};

// do Stuff with local AirportFinder here.

// If neccesary hoist to global namespace
ROOT.AirportFinder = AirportFinder;
}());

如果他们不需要是全局性的。我自己使用别名($.foobar 因为 jQuery 无论如何都是全局的)来存储任何全局数据。

恐怕我无法告诉您.namespace 函数的作用。这不是真的必要。

我个人的偏好是始终使用闭包来创建私有(private)命名空间,并将任何内容提升到需要的全局/共享命名空间。这将全局可见性/集群降至最低。

关于Javascript 命名空间——这是一个好的模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5231088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com