2015-11-17 14 views
8

Ho una funzione che può essere utilizzata solo all'interno di una classe e non voglio che sia accessibile al di fuori della classe.Come dichiarare la funzione locale all'interno della classe ES6?

class Auth { 
    /*@ngInject*/ 
    constructor($http, $cookies, $q, User) { 
    this.$http = $http; 
    this.$cookies = $cookies; 
    this.$q = $q; 
    this.User = User; 

    localFunc(); // Need to create this function, and need it to be accessible only inside this class 
    } 
} 

Quello che ho fatto finora sta dichiarando la funzione di fuori della classe

function localFunc() { 
    return 'foo'; 
} 
class Auth { 
    ... 
} 

Tuttavia, questo non va bene in quanto inquina la funzione globale, tranne ho avvolto dentro IIFE. Quindi, c'è un modo per creare una funzione locale all'interno di una classe ES6?

+3

Se si utilizza un caricatore di moduli ES6, dichiarare che la funzione al di fuori della classe non inquina l'ambito globale. È la strada da percorrere per garantire funzioni private in ES6 – CodingIntrigue

+1

@ MichałPerłakowski Non penso che sia un duplicato, il [suggerito canonico] (https://stackoverflow.com/questions/22156326/private-properties-in-javascript-es6 -classes) si occupa di * stateful, proprietà specifiche dell'istanza * non funzioni/metodi. – Bergi

risposta

13

No, non v'è alcun modo per dichiarare le funzioni locali in un class. Ovviamente puoi dichiarare metodi di supporto (statici) e contrassegnarli come "privati" usando prefissi di sottolineatura, ma probabilmente non è quello che vuoi. E puoi sempre dichiarare la funzione locale all'interno di un metodo.

Ma se ne avete bisogno più volte, l'unica soluzione è posizionarlo accanto allo class. Se stai scrivendo una sceneggiatura, sarà necessario un IEFE come al solito. Se stai scrivendo un modulo ES6 (che è la soluzione preferita), la privacy è banale: semplicemente non la funzione export.

+0

Se si posiziona la funzione accanto alla classe, non avrà accesso a 'this', quindi sarà necessario passarlo come parametro. –

+0

@DanDascalescu Certo, penso che l'OP abbia deliberatamente chiesto una * funzione * sebbene non un * metodo *. – Bergi

0

è possibile utilizzare un simbolo:

const localFunc = Symbol(); 
class Auth { 
    /*@ngInject*/ 
    constructor($http, $cookies, $q, User) { 
    this.$http = $http; 
    this.$cookies = $cookies; 
    this.$q = $q; 
    this.User = User; 

    this[localFunc] = function() { 
     // I am private 
    }; 
    } 
} 
+1

I simboli non sono privati. – Bergi

Problemi correlati