2012-07-04 11 views
5

Qualcuno può spiegare che cosa significa questo estratto da Single Page Apps in Depth?Nascondere metodi di classe utilizzando .call/.apply

un modello comune per le classi (ad esempio oggetti istanziati da un prototipo ) è quello di contrassegnare semplicemente i metodi della classe come private avviando loro con una sottolineatura. È possibile nascondere correttamente i metodi di classe utilizzando .call/.apply per impostare "questo", ma non lo mostrerò qui; è un dettaglio minore .

penso che suggerisce che c'è un modo per rendere realtà i metodi 'privati' JavaScript effettivamente inaccessibili al posto della Convenzione di appena contrassegnandoli con un carattere di sottolineatura, ma non riesco a immaginare che cosa un'implementazione sarebbe simile, né come sarebbe usato

+0

+1 per il collegamento alle app della pagina singola ebook! Grazie.. – renatoargh

risposta

3
var Treasure = function(){ 
    function locate(){ 
    return this.x * this.y + 31337; 
    } 

    function Treasure(x, y){ 
    this.x = x; 
    this.y = y; 
    } 

    Treasure.prototype.find = function find(){ 
    return locate.call(this); 
    }; 

    return Treasure; 
}(); 

locate è una funzione privata condivisa per i metodi costruttore e prototipo. Utilizzando call può agire come un metodo e utilizzare this.

Un'implementazione più completa di questo concetto è quella degli oggetti di interfaccia e degli oggetti di implementazione. Invece di avere alcune funzioni casuali come metodi (simili a locate sopra) in realtà crei un'intera classe privata. Ogni creazione esterna dell'interfaccia risulta in due oggetti raggruppati: l'interfaccia della shell pubblica e l'oggetto di implementazione privato. Ciò ti consente di esporre un'interfaccia che fornisce pubblicamente un'API diversa, forse più facile da usare. Oppure puoi permetterti di riutilizzare singoli oggetti di implementazione privati ​​per interi gruppi di oggetti di interfaccia.

Questo è in realtà il modo in cui il DOM viene specificato per funzionare (di solito non è implementato in js). Gli oggetti di interfaccia (elemento e oggetti nodo per esempio) sono specificamente richiesti per avvolgere l'implementazione sottostante che effettivamente fa la parola. Gli oggetti esposti sono poco più di shell che inoltrano l'accesso alle proprietà e il richiamo del metodo.

Dom.js è un'implementazione DOM completa realizzata in js. Una tecnica interessante con cui mi sono familiarizzato mentre lavoravo era la generazione completamente automatizzata di interfacce pubbliche. Questo è lo scopo di IDL: l'API pubblica viene letteralmente generata automaticamente, lasciando solo l'implementazione privata effettivamente creata. Che cosa significa in realtà questo è possibile creare cose come questa senza consultare un umano: https://github.com/Benvie/svgstuff/blob/master/lib/defs.js

1

In questo esempio è possibile visualizzare i due tipi di variabili. Noterete che la prima è privata, il secondo è accessibile al pubblico:

function x() { 
    var _var1 = "hello"; 
    this.var2 = "world"; 
    x.prototype.innerTest = function() { 
     console.log("inner var1: " + _var1); 
     console.log("inner var2: " + this.var2); 
    } 
} 

var y = new x; 
console.log("var1: " + y._var1); 
console.log("var2: " + y.var2); 

// var1: undefined 
// var2: world 

L'esecuzione del test interno mostra che var1 si può accedere dall'interno della classe:

y.innerTest(); 
// var1: hello 
// var2: world 
Problemi correlati