如何创建公共和私人会员?
我有点困惑,我怎样才能创建公共和私人成员。
到目前为止,我的代码模板如下:
(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()); } }; }();
您可以定义私有成员,其中定义了myPrivateVar
和myPrivateMethod
,以及定义了myPrivateVar
和myPrivateMethod
的公共成员。
您可以按如下方式访问公共方法和属性:
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
以下是详细解释此技术的文章:
三件事:
-
IIFEs:
您似乎需要刷新有关此模式的知识。 再次使用IIFE之前,请先看一下这篇文章。 -
全球公众与安全公众:
使用someFunction
和someOtherFunction
跳过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 */
-
公约和范围合并:
我们不能指望每个开发人员遵循下划线或大写惯例。 如果其中一个人忘记实施这项技术会怎么样? 我们可以将两者结合起来,而不仅仅依赖于约定(_private
,GLOBAL
)和范围(函数范围)。 这有助于保持编码风格的一致性并提供适当的成员安全性。 所以,如果下次有人忘记大写他们的全局,控制台(严格模式)可以阻止世界结束。
Javascript没有真正的私人成员。 如果你真的需要隐私,你必须滥用范围。