2012-03-28 16 views
5

Sto valutando selfish e mi chiedo come posso dichiarare metodi/campi privati?Metodi e campi privati ​​

+0

Guardando gli esempi direi che è una buona domanda :)) – mihai

+0

Mi sono inventato questa soluzione qui che coinvolge variabili private + chiusure, cosa ne pensi? http://marcelorjava.wordpress.com/2014/06/07/object-oriented-programming-with-java-and-javascript/ – theMarceloR

risposta

4

Il modo usuale per eseguire funzioni private consiste nell'utilizzare una funzione in cui i vari "metodi" si chiudono, ad es. raccogliendo la loro Dog esempio, modificare questo:

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

Per

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

Usage:

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

Re campi privati ​​, come al solito è quello di costruire qualsiasi cosa che ha veramente bisogno privata campi all'interno della funzione di costruzione in modo che chiudano le variabili (private) all'interno della chiamata al costruttore, a'la Crockford's pattern:

function Foo(arg) { 
    var trulyPrivateData = arg; 

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

Usage:

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

... egoista elimina la funzione di costruzione vera e propria, ma la funzione initialize dovrebbe servire allo stesso scopo:

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

Ora, impossibile impostare woof (eccetto che al momento della costruzione, perché l'abbiamo fatto apposta), è possibile recuperarlo solo da bark. Ad esempio, è veramente privato (a parte questo abbiamo esplicitamente permesso a bark di restituirlo).

Se si entra in dettagli tecnici di questo, questi articoli dal mio blog possono (o non possono) essere utile, dal momento che quando si entra in funzioni private e simili, è in genere hanno per iniziare a gestire this:

E se vuoi valutare un'altra cosa, c'è la mia Lineage project, che è un'eredità prototipica allo stesso modo, ma con un facile accesso alle proprietà dell'oggetto, alle funzioni, ecc. E una sintassi che incoraggia attivamente gli ambiti privati ​​per questo genere di cose.

+0

Questo ti dà proprietà private a livello di classe; Non sono sicuro che potresti avere proprietà private per istanza senza alcune modifiche a tale framework. Comunque non ho ancora avuto molto caffè stamattina. – Pointy

+1

@Pointy: Non c'è differenza tra "istanza" e "livello" "metodi" in JavaScript eccetto come li chiami. Il modo in cui ho chiamato 'reallyPrivate', era specifico dell'istanza. Se l'avessi chiamato senza '.call' e appena passato nell'istanza di' Dog' come argomento, sarebbe stato "specifico" di classe. Non è possibile eseguire funzioni veramente private chiamate tramite la notazione 'this.xyz()' direttamente in JavaScript (indipendentemente dal framework), poiché tutte le proprietà sull'istanza sono pubbliche.Altro (abbastanza datato): http://blog.niftysnippets.org/2009/09/private-methods-in-javascript.html –

+0

Right right; Non ho visto che c'è un "inizializzare", né imparare molto altro su quel framework nei 15 secondi che ho trascorso sul github "readme" :-) Sta solo facendo degli oggetti, quindi aggiungere una proprietà da una chiusura non è diverso con il quadro che senza. – Pointy

Problemi correlati