我在JS代码中一直使用这种模式:
function Thing() {
var otherData = {
// Private variables?
name : "something"
}
var myThing = {
data: "somedata",
someFunction: function () {
console.log(otherData.name);
}
}
return myThing;
}
然后在使用它时:
var thing = Thing();
thing.someFunction();
我已经在JS中看到过构造函数和单例的例子,但我以前没有碰过这种模式。这个模式有名字吗?这种模式有任何潜在的问题吗?以前我只是使用对象文字模式,但希望通过将其置于闭包中来获取私有变量。
答案 0 :(得分:3)
这个模式有名称吗?
这有各种各样的名字。我听过的常见的是:
为了避免混淆,我们不会将它们称为“构造函数”或“构造函数”,因为该术语专门用于与new
一起使用的函数,而不是var thingProto = {
method: function() {
// I'm a shared method
}
};
function buildThing() {
var otherData = {
// Private variables?
name : "something"
}
var myThing = Object.create(thingProto);
myThing.data = "somedata";
myThing.someFunction = function () {
console.log(otherData.name);
};
return myThing;
}
。
(注意:在此上下文中“构建器函数”与构建器模式 [例如,GoF模式]无关。这是完全不同的事情。同样,“工厂函数”在这里与工厂模式无关,但在这种情况下有重叠,因为工厂模式使用工厂功能。“Maker”的优点是没有那种潜在的混淆;我确信在某处有某种“制造者模式”,但至少不在最初的GoF书中。)
此模式是否存在任何潜在问题?
嗯,所有模式都存在潜在问题。 :-)这个没什么特别的问题,不,没有。
只是指出不的一个问题:有人可能会提到你没有利用那种模式的原型,但也许你只需要一个与那个特定的构建器,如果你这样做,你可以轻松使用一个:
Thing
不会改变模式。
作为样式注释,通常你不会将其大写,因为JavaScript中压倒性的约定是大写函数是构造函数。因此,createThing
可能会被称为buildThing
或thing
或仅for(int j = 1; j < A.length()-i; j++)
。
答案 1 :(得分:0)
构造函数调用模式是在函数调用前加上new
关键字后跟空格的前缀。这允许函数充当构造函数,将其原型属性(ConstructorFunction.prototype
)指定为返回对象的原型属性(instanceObj.__proto__
),并通过{{修改对象的属性1}}关键字。因此,您使用该功能的方式不是&#34;构造函数模式&#34;。
使用函数闭包封装数据通常称为Module Pattern。
以下是Addy Osmani的书中的相关章节:Learning JavaScript Design Patterns。
模块模式最初被定义为提供两者的方式 传统软件中的类的私有和公共封装 工程。
在JavaScript中,Module模式用于进一步模拟 课程的概念,以便我们能够包括两者 因此,单个对象内的公共/私有方法和变量 将特定部件与全球范围隔离开来。这导致了什么 是减少我们的函数名称冲突的可能性 与页面上的其他脚本中定义的其他功能。
隐私
模块模式封装了&#34;隐私&#34;,州和组织 使用闭包。它提供了一种包含公共和公共混合的方式 私有方法和变量,保护件免于泄漏 全球范围,并意外地与另一个开发人员发生冲突 接口。使用此模式,只返回一个公共API,保留 封闭内的其他一切都是私密的。
这为我们提供了一个干净的解决方案,用于屏蔽逻辑 提升,同时只暴露一个界面,我们希望我们的其他部分 申请使用。该模式非常类似于 立即调用的函数表达式(IIFE - 参见上一节) 除了对象之外,还有更多关于此的命名空间模式 返回而不是功能。
应该指出的是,并没有真正明确的真实感 &#34;隐私&#34;在JavaScript中,因为与一些传统语言不同, 它没有访问修饰符。变量在技术上是不可能的 声明为公共或私有,因此我们使用函数范围 模拟这个概念。在模块模式,变量或方法中 声明只在模块内部可用,这要归功于 关闭。返回对象中定义的变量或方法 但每个人都可以使用。