2010-07-10 118 views
8

如何创建无法从外部调用的函数?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(); 
+1

你想**静态函数或静态方法**?你希望它是静态的吗? (该示例没有说明) – galambalazs 2010-07-10 11:34:23

+0

静态方法和函数之间有什么区别? :S (顺便说一句,用这两个词) – user 2010-07-10 12:10:14

回答

19

你可能要考虑使用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()); 
     } 
    }; 
})(); 

您可以定义myPrivateVarmyPrivateMethod定义您的私有成员,你的公共成员,其中myPublicVar和定义了myPublicMethod

你可以简单地访问公共的方法和属性如下:

obj.myPublicMethod(); // Works 
obj.myPublicVar;   // Works 
obj.myPrivateMethod(); // Doesn't work - private 
obj.myPrivateVar;  // Doesn't work - private 
+4

myPrivateMethod不是一个“静态”函数。你错过了标题。 – galambalazs 2010-07-10 11:15:23

+0

你是对的......让我们来澄清一下我的答案。 – 2010-07-10 11:38:47

+1

我不相信YAHOO对模块模式有任何权利;) – 2010-07-10 14:13:28

3

可以使用封闭,沿东西....的

var construct = function() { 

    var obj = {}; 

    var method1 = function() { 
     alert("method1"); 
    } 

    obj.method2 = function() { 
     alert("method2..."); 
     method1(); 
    } 

    return obj; 
} 

obj = construct(); 

然后行:

obj.method2可以访问,但obj.method1不存在供公众使用。它只能使用该类的成员函数进行访问。

7

简单的答案是你不能同时做两个。您可以创建"private"方法或"static"方法,但不能像在其他语言中那样创建私有静态函数

可以模拟隐私的方式是关闭

function f() { 

    function inner(){} 

    return { 
    publicFn: function() {}, 
    publicFn2: function() {} 
    } 
} 

这里,因为关闭中,inner功能将被创建每次调用f时间,而公共职能可以存取权限此inner功能,但对于外部世界inner隐藏

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

function f() {} 

f.staticVar = 5; 
f.staticFn = function() {}; 
// or 
f.prototype.staticFn = function() {}; 

这里的函数对象f将只能从实例一个staticFn它可以访问静态变量,但一无所获。

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

因此,您要么创建一个不访问实例中任何内容的私有方法,要么创建一个静态方法,而您并不试图从外部访问它。

+0

我想问题是javascript是否有静态方法。 'f.prototype.staticFn'实际上只是原型对象的一个​​公共实例成员。它只是静态的,因为作为不同对象实例的成员,它不能访问此实例的私有成员。你也可以用一个私有方法来做到这一点 - 仅仅给原型实例一个私有方法 - 这只是因为子实例不能访问方法而没有帮助。所以更短的答案是在JavaScript中没有静态方法。 – Matthew 2016-01-28 16:11:33

1

你可以这样说:

var obj = new function() { 
    var method1 = function() { // private } 
    this.method2 = function() { // public } 
} 

obj.method1(); // not possible 
obj.method2(); // possible 

注意,我还使用匿名构造函数。这与Singleton模式类似。

1

也许你想要一个只包含公共方法的代理对象,例如

var obj = (function() { 
    var obj = { 
    method1: function(){ 
     alert("method1"); 
    }, 
    method2: function(){ 
     alert("method2..."); 
     obj.method1(); 
    } 
    } 
    return { 
    method2: function() { return obj.method2.apply(obj, arguments) } 
    } 
})() 

// you could only call this function 
obj.method2(); 
// this function inaccessible 
obj.method1(); 

我在javascript中看不到私有方法的要点。如果你不想让人们调用一个方法,那么不要做广告。私有方法也使调试更加困难。