我已经熟悉模块模式,在该模式中,我们定义一个具有私有(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/