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

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

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

(function()){ var _blah = 1; someFunction = function() { alert(_blah); }; someOtherFunction = function() { someFunction(); } }(); 

您可能想要使用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 ,以及定义了myPrivateVarmyPrivateMethod的公共成员。

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

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

你没有。 您可以依赖约定 ,将_添加到您的私有属性,然后不使用不应该使用它的代码触摸它们。

或者,您可以使用函数范围创建无法从外部访问的变量 。

在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

三件事:

  1. IIFEs:
    您似乎需要刷新有关此模式的知识。 再次使用IIFE之前,请先看一下这篇文章。

  2. 全球公众与安全公众:
    使用someFunctionsomeOtherFunction跳过var关键字会导致在全局范围内注册这些函数对象,即,可以从代码中的任何位置调用和重新分配这些函数。 随着代码规模的扩大,这可能会导致一些严重的错误。 相反,正如丹尼尔建议的那样,使用模块模式。 虽然你可以使用其他方法,比如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 )和范围(函数范围)。 这有助于保持编码风格的一致性并提供适当的成员安全性。 所以,如果下次有人忘记大写他们的全局,控制台(严格模式)可以阻止世界结束。

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