2015-11-17 9 views
8

Ich habe eine Funktion, die nur innerhalb einer Klasse verwendet werden kann und nicht außerhalb der Klasse zugänglich sein soll.Wie deklariert man lokale Funktion innerhalb der ES6-Klasse?

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 
    } 
} 

Was ich bisher getan haben, ist die Funktion außerhalb der Klasse erklärt

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

Allerdings ist dies nicht gut, wie es die globale Funktion verunreinigen, ohne dass ich ihn innen IIFE gewickelt. Also, kann ich irgendwie eine lokale Funktion in einer ES6-Klasse erstellen?

+3

Wenn Sie einen ES6-Modullader verwenden, wird die globale Klasse nicht durch Deklaration der Funktion außerhalb der Klasse verschmutzt. Es ist der Weg zu gehen, um private Funktionen in ES6 sicherzustellen – CodingIntrigue

+1

@ MichałPerłakowski Ich glaube nicht, dass es ein Duplikat ist, die [vorgeschlagene kanonische] (https://stackoverflow.com/questions/22156326/private-properties-in-japascript-es6 -klassen) behandelt * Stateful, instance-spezifische Eigenschaften * not functions/methods. – Bergi

Antwort

13

Nein, es gibt keine Möglichkeit, lokale Funktionen in einem class zu erklären. Sie können natürlich (statische) Hilfsmethoden deklarieren und sie mit Unterstrichpräfixen als "privat" markieren, aber das ist wahrscheinlich nicht das, was Sie wollen. Und Sie können die lokale Funktion immer innerhalb einer Methode deklarieren.

Aber wenn Sie es mehrmals benötigen, dann ist der einzige Weg zu gehen, es neben dem class zu platzieren. Wenn Sie ein Skript schreiben, wird wie üblich ein IEFE benötigt. Wenn Sie ein ES6-Modul schreiben (was die bevorzugte Lösung ist), ist die Privatsphäre trivial: einfach nicht die Funktion export.

+0

Wenn Sie die Funktion neben der Klasse platzieren, hat sie keinen Zugriff auf 'this', also müssen Sie sie als Parameter übergeben. –

+0

@DanDascalescu Sicher, ich denke, das OP hat absichtlich eine * Funktion * verlangt, aber keine * Methode *. – Bergi

0

könnten Sie ein Symbol verwenden:

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

Symbole sind nicht privat. – Bergi

Verwandte Themen