2010-07-10 2 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

+0

В чем разница между статическим методом и функцией? : S (btw извините за использование обоих слов) – user

ответ

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()); 
     } 
    }; 
})(); 

Вы определяете ваши личные элементы, где myPrivateVar и myPrivateMethod определены, и ваши открытые члены где myPublicVar и myPublicMethod.

Вы можете просто получить доступ к общественным методы и свойства следующим образом:

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

myPrivateMethod не является «статической» функцией. Вы пропустили титул. – galambalazs

+0

Вы правы ... Позвольте мне прояснить мой ответ. –

+1

Я не верю, что у YAHOO есть какие-либо права на шаблон модуля;) –

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, и общественные функции могут Acces этой 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

1

Объекты могут быть получены путем конструкторов, которые являются функциями, которые инициализируют объекты. Конструкторы предоставляют функции, которые предоставляют классы на других языках, включая статические переменные и методы.

Читайте об этом в http://www.crockford.com/javascript/private.html

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. Если вы не хотите, чтобы люди вызывали метод, не рекламируйте его. Частные методы также делают отладку только такой бит сложнее.