JavaScript模块和设计模式

3
我有一些关于 JavaScript 中创建模块的方式的问题。这是我找到的语法:
var Westeros;
(function (Westeros) {
    (function (Structures) {
        var Castle = (function () {
            function Castle(name) {
                this.name = name;
            }
            Castle.prototype.build = function () {
                console.log("Castle " + this.name)
            };
            return Castle;
        })();
        Structures.Castle = Castle;
    })(Westeros.Structures || (Westeros.Structures = {}));
    var Structures = Westeros.Structures;
})(Westeros || (Westeros = {}));

var winterfell = new Westeros.Structures.Castle("Winterfell");
winterfell.build();

我从《精通JavaScript设计模式》中得到了这段代码this code from Mastering Javascript Design Patterns。然而,我尝试找到答案,为什么你需要这行代码:
    var Structures = Westeros.Structures;

如果您省略此行,则代码将按预期工作。有什么解释吗?也许是为了“揭示”这个类吗?
谢谢!

7
该代码太丑陋了。有一本书教你这样做吗? - Robert Moskal
这行代码完全没有意义。也许它存在是因为后续的示例会引入更多的代码,但在此处发布的代码中,这行代码什么也没做。 - Pointy
绝对很难读懂... - Legends
我使用 require.js,它用于依赖管理和模块化的代码。 - Legends
Westeros || (Westeros = {}) - sms343
显示剩余3条评论
1个回答

1

这段代码很可怕。下面是一个示例,它可以在不使用所有无用的闭包的情况下完成完全相同的操作:

function Castle(name) {
    this.name = name;
}

Castle.prototype.build = function() {
    console.log("Castle " + this.name)
};

var Westeros = {
    Structures: {}
};

Westeros.Structures.Castle = Castle;

var winterfell = new Westeros.Structures.Castle("Winterfell");
winterfell.build();

在ES5中定义“class”时,您只需声明具有某些参数的函数并放置任何初始化代码即可。方法将添加到该函数的 .prototype 属性中,并通过使用 new 关键字调用其构造函数来创建使用该类的新对象。
至于 var Structures = Westeros.Structures; ,它完全没有任何作用。如果您保留原始代码示例并将其删除,则不会发生任何变化。实际上,它甚至不能被更多下面的代码使用,因为它在闭包内声明,无法在该范围之外访问。

如果你想模拟命名空间怎么办?一个非常简单的解决方案就是创建一个全局对象,然后在其中添加对象,不是吗? - sms343
没错。如果您将此代码放置在全局范围内,Westeros 将成为全局变量,因此 Castle 可以通过 Westeros "命名空间" 在任何地方访问。您还可以查看并了解 RequireJS 是否符合您的需求。 - Hydrothermal
太棒了,谢谢!在纯JavaScript中,我从不同的来源看到了这种模块的创建方式(function(){})()。我认为你可以用其他解决方案以类似的方式实现设计模式。 - sms343
@sms343 IIFEs((function() { … })();)可以与几乎任何解决方案一起使用。它们的主要目的是避免污染其父范围,因为所有函数声明都在其中词法绑定。如果您想要,我可以编辑我的答案以使用IIFE。 - Hydrothermal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接