如何创建公共和私人会员?

时间:2010-05-10 14:20:21

标签: javascript jquery

我有点困惑,我怎样才能创建公共和私人会员。

到目前为止,我的代码模板如下:

(function()){
   var _blah = 1;

   someFunction = function() {
     alert(_blah);
   };

   someOtherFunction = function() {
     someFunction();
   }
}();

6 个答案:

答案 0 :(得分:14)

您可能想要使用Yahoo Module Pattern

myModule = function () {

    //"private" variables:
    var myPrivateVar = "I can be accessed only from within myModule."

    //"private" method:
    var myPrivateMethod = function () {
        console.log("I can be accessed only from within myModule");
    }

    return {
        myPublicProperty: "I'm accessible as myModule.myPublicProperty."

        myPublicMethod: function () {
            console.log("I'm accessible as myModule.myPublicMethod.");

            //Within myProject, I can access "private" vars and methods:
            console.log(myPrivateVar);
            console.log(myPrivateMethod());
        }
    };
}();

您定义的私人会员定义了myPrivateVarmyPrivateMethod,以及定义myPublicPropertymyPublicMethod的公开会员。

您可以按如下方式访问公共方法和属性:

myModule.myPublicMethod();    // Works
myModule.myPublicProperty;    // Works
myModule.myPrivateMethod();   // Doesn't work - private
myModule.myPrivateVar;        // Doesn't work - private

答案 1 :(得分:1)

您没有。 You can rely on convention,将_添加到您的私有属性中,然后不使用不应该使用它的代码触及它们。

您无法从外部访问use the function scope to create variables

答案 2 :(得分:1)

在javascript中,每个对象成员都是公共的。最流行的声明私有字段的方法是在其名称中使用下划线符号,只是为了让其他人知道这是私有字段:

a = {}
a._privateStuff = "foo"

隐藏变量的另一种方法是使用javascript中的范围:

function MyFoo {
    var privateVar = 123;
    this.getPrivateVar = function() {
        return privateVar;
    }
}

var foo = new MyFoo();

foo.privateVar // Not available! 
foo.getPrivateVar() // Returns the value

以下是详细解释此技术的文章:

http://javascript.crockford.com/private.html

答案 3 :(得分:1)

三件事:

  1. <强> IIFEs:
    您似乎需要刷新有关此模式的知识。在再次使用IIFE之前,请查看this帖子。

  2. 全球公众与安全公众:
    使用varsomeFunction跳过someOtherFunction关键字会导致在全局范围内注册这些函数对象,即,可以从代码中的任何位置调用和重新分配这些函数。随着代码规模的扩大,这可能会导致一些严重的错误。相反,正如Daniel建议的那样,使用模块模式。虽然你可以使用其他方法,比如Constructors,Object.create()等,但实现起来非常简单。

    /* create a module which returns an object containing methods to expose. */
     var someModule = (function() {  
         var _blah = 1;  
          return {  
            someFunction: function() {},  
            someOtherFunction: function() {}  
          };  
     })(); 
    /* access someFunction through someModule */
    someModule.someFunction();
    // ...
    // ....
    /* after 500+ lines in this IIFE */
    /* what if this happens */  
    someFunction = function() {  
        console.log("Global variables rock.");  
    };  
    /* Fortunately, this does not interfere with someModule.someFunction */
    
  3. 公约和范围合并:
    我们不能指望每个开发人员都遵循下划线或大写惯例。如果他们中的一个忘记实现这种技术怎么办?我们可以将两者结合起来,而不仅仅依赖于约定(_privateGLOBAL)和范围(函数范围)。这有助于保持编码风格的一致性并提供适当的成员安全性。所以,如果下次有人忘记大写他们的全局变量,控制台(严格模式)可以阻止世界结束。

答案 4 :(得分:0)

Javascript没有真正的私人会员。如果你真的需要隐私,你必须滥用范围。

答案 5 :(得分:0)