这是一个JavaScript构造函数模式吗?

时间:2015-11-12 17:08:07

标签: javascript oop design-patterns

我在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中看到过构造函数和单例的例子,但我以前没有碰过这种模式。这个模式有名字吗?这种模式有任何潜在的问题吗?以前我只是使用对象文字模式,但希望通过将其置于闭包中来获取私有变量。

2 个答案:

答案 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可能会被称为buildThingthing或仅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中,因为与一些传统语言不同,   它没有访问修饰符。变量在技术上是不可能的   声明为公共或私有,因此我们使用函数范围   模拟这个概念。在模块模式,变量或方法中   声明只在模块内部可用,这要归功于   关闭。返回对象中定义的变量或方法   但每个人都可以使用。