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

标签 javascript module-pattern

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

但是,如果我想要一个更加面向对象的模式,我可以使用与模块模式相同的结构,但不立即执行,如下所示:

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")

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

最佳答案

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

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

如果您不担心这些缺点,应该没问题。

关于javascript - 使用模块模式的非立即执行变体的类似类的代码结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20197510/

相关文章:

javascript - 开发 JavaScript - 我应该什么时候开始进行单元测试?

javascript - 如何从所选文本中获取相邻字符?

javascript - Mongodb不保存文档

javascript - 从日期获取月份的周数(从星期一开始的星期)

javascript - jQuery 插件的每个实例如何拥有自己的属性和方法?

javascript - Discord.JS |从用户消息中删除嵌入的功能或方法?

javascript - 我应该如何使用模块模式处理长 JavaScript 文件?

javascript - 传递参数时如何避免模块模式中的 getter/setter 函数

javascript - 如何在单页 Web 应用程序中组织您的模型并实现封装