javascript中的私有静态函数

use*_*ser 10 javascript

如何创建一个无法从外部调用的函数?

var obj = {
    function1: function(){
        alert("function1");
    },
    function2: function(){
        alert("function2...");
        obj.function1();
    }
};
// so how to make this function unaccessible 
obj.function1();
// and you could only call this function
obj.function2();
Run Code Online (Sandbox Code Playgroud)

Dan*_*llo 23

您可能需要考虑使用Yahoo Module Pattern.这是一个单例模式,这些方法并不是静态的,但它可能正是您所寻找的:

var obj = (function () {

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

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

   return {
      myPublicVar: "I'm accessible as obj.myPublicVar",

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

         //Within obj, I can access "private" vars and methods:
         console.log(myPrivateVar);
         console.log(myPrivateMethod());
      }
   };
})();
Run Code Online (Sandbox Code Playgroud)

您可以定义您的私有成员myPrivateVarmyPrivateMethod定义,并在你的公共成员myPublicVarmyPublicMethod定义.

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

obj.myPublicMethod();    // Works
obj.myPublicVar;         // Works
obj.myPrivateMethod();   // Doesn't work - private
obj.myPrivateVar;        // Doesn't work - private
Run Code Online (Sandbox Code Playgroud)

  • myPrivateMethod不是"静态"函数.你错过了冠军. (4认同)
  • 我相信这种模式起源于雅虎的道格拉斯·克罗克福德,并通过YUI团队的Eric Miraglia的一篇文章推广:http://www.yuiblog.com/blog/2007/06/12/module-pattern/ (3认同)

gbl*_*zex 7

简单的答案是你不能两者都做.您可以创建"private"方法或"static"方法,但不能像在其他语言中那样创建专用静态函数.

您可以模仿隐私的方式是关闭:

function f() {

  function inner(){}

  return {
    publicFn:  function() {},
    publicFn2: function() {}
  }
}
Run Code Online (Sandbox Code Playgroud)

这里因为关闭,inner每次调用时都会创建函数,f公共函数可以访问此inner函数,但外部世界inner将被隐藏.

创建对象的静态方法的方法很简单:

function f() {}

f.staticVar = 5;
f.staticFn = function() {};
// or
f.prototype.staticFn = function() {};
Run Code Online (Sandbox Code Playgroud)

这里的函数对象f只有一个staticFn可以访问静态变量的函数,但实例中没有.

请注意,prototype版本将继承,而第一个版本不会.

因此,您要么创建一个不从实例访问任何内容的私有方法,要么创建一个静态方法,您不会尝试从外部访问.