2012-03-28 19 views
5

Estoy evaluando selfish y estoy preguntando cómo puedo declarar métodos/campos privados?Métodos privados y campos

+0

En cuanto a los ejemplos, diría que es una muy buena pregunta :)) – mihai

+0

Se me ocurrió esta solución aquí que implica variables privadas + cierres, ¿qué opinas? http://marcelorjava.wordpress.com/2014/06/07/object-oriented-programming-with-java-and-javascript/ – theMarceloR

Respuesta

4

La forma habitual de realizar funciones privadas es utilizar una función que sus diversos "métodos" cierran, por ejemplo. recogiendo su ejemplo Dog, cambiar esta situación:

// The basic Dog example 
var Dog = Base.extend({ 
    bark: function() { 
    return 'Ruff! Ruff!' 
    } 
}); 

Para

// Adding a private function 
var Dog = Base.extend((function(){ 
    function trulyPrivate() { 
    console.log(this.bark()); 
    } 

    return { 
    bark: function() { 
     return 'Ruff! Ruff!' 
    }, 
    logBark: function() { 
     trulyPrivate.call(this); 
    } 
    }; 
})()); 

Uso:

new Dog().logBark(); // logs "Ruff! Ruff!" using the truly private function behind the scenes 

Re campos privados, la forma habitual es construir cualquier cosa que necesita verdaderamente privadas campos dentro de su función de constructor para que cierren sobre las variables (privadas) dentro de la llamada al constructor, a'la Crockford's pattern:

function Foo(arg) { 
    var trulyPrivateData = arg; 

    this.logIt = function() { 
     console.log(trulyPrivateData); 
    }; 
} 

Uso:

var f = new Foo(42); 
f.logIt(); // logs 42 even though there's no way, externally, to get that value from `f` 

... egoísta elimina la función constructora real, pero la función initialize debe servir al mismo propósito:

var Dog = Base.extend({ 
    initialize: function(arg) { 
    var woof = arg || 'Ruff! Ruff!'; 
    this.bark = function() { 
     return woof; 
    }; 
    } 
}); 

Ahora, no se puede configurar el woof (excepto en el momento de la construcción, porque lo hicimos a propósito), solo puede recuperarlo de bark. Por ejemplo, es verdaderamente privado (aparte de que hemos permitido explícitamente bark devolverlo).

Si usted entra en los detalles técnicos de esto, estos artículos de mi blog pueden (o no) ser útil, ya que cuando usted entra en funciones privadas y tal, que por lo general tienen que empezar a gestionar this:

Y si quiere otra cosa para evaluar, está mi Lineage project, que es una herencia prototípica igualmente pura, pero con fácil acceso a las propiedades de los objetos principales, funciones, etc. y una sintaxis que fomenta activamente los ámbitos privados para este tipo de cosas.

+0

Eso le da propiedades privadas a nivel de clase; No estoy seguro de que pueda tener propiedades privadas por instancia sin algunas modificaciones a ese marco. Sin embargo, esta mañana no he tomado mucho café. – Pointy

+1

@Pointy: no hay diferencia entre los "métodos" de "instancia" y "nivel de clase" en JavaScript, excepto cómo los llama. La forma en que llamé 'trulyPrivate', era específica de la instancia. Si lo hubiera llamado sin '.call' y acabara de pasar en la instancia' Dog' como argumento, hubiera sido específico de "clase". No se pueden realizar funciones realmente privadas que se invocan mediante la notación 'this.xyz()' directamente en JavaScript (independientemente del marco), ya que todas las propiedades de la instancia son públicas.Más (bastante anticuado): http://blog.niftysnippets.org/2009/09/private-methods-in-javascript.html –

+0

Derecha; No vi que haya una "inicialización" ni realmente aprendí mucho más sobre ese marco en los 15 segundos que pasé en el "readme" de github :-) Es solo hacer objetos, por lo que agregar una propiedad de un cierre no es ningún diferente con el marco que sin él. – Pointy

Cuestiones relacionadas