类代码结构,使用非立即执行的模块模式变体

Class like code structure using non immediately executing varient of the module pattern

本文关键字:执行 模块 模式 结构 代码      更新时间:2023-10-11

我已经熟悉模块模式,在该模式中,我们用函数闭包和一组公开的公共方法定义了一个具有私有状态的模块。然而,这似乎更接近于单例而不是对象。

然而,如果我想要一个更面向对象的模式,我可以使用与模块模式相同的结构,但不立即执行吗

function MyPseudoClass(constructorArg0, constructorArg1... ) {
    var privateVar = "private!!";
    var privateComplexVar = constructorArg0;
    var privateComplexVar1 = constructorArg1;
    return {
        publicVar: "public Varaible!",
        publicMethod: function() {
            //code
            return privateVar + 1;
    }
};

现在,在我的代码中,我可以创建伪类的实例,如下所示:

var instance = MyPseudoClass({p : 2, q : 100},"x")
var anotherInstance = MyPseudoClass({p : 3, q : 230},"y")

据我所知,这似乎是我想要的,但我还没有在网上看到有人使用这种方法,我应该意识到这种方法有什么缺点吗?

您没有使用原型继承;这是主要区别。你的主要缺点是:

  • 您不能使用instanceof来确保变量是某种类型的(因此您不能执行myVar instanceof MyPseudoClass。您不使用此方法创建实例;您只创建一个对象
  • 基于原型的方法可能会更快,因为闭包会带来开销。此外,在原型化方法中,每个实例将共享一个函数的同一个实例(分配给原型)。但在闭包方法中,每个"实例"都有自己的函数副本。然而,差异很小(尤其是在较新的浏览器中)

如果你不担心这些缺点,你应该没事。