2016-05-11 15 views
-1

In ES5 konnte ich eine Fabrik Muster wie folgt verwenden:machen Konstruktorargumente privilegiert ES6 Klassenmethoden

function factory(a) { 
    return { 
    say: function() { 
     return console.log(a) 
    } 
    }; 
} 

var instance = factory('hi'); 
instance.say(); // => 'hi' 
instance.a; // => 'undefined' 

Das Argument der Fabrik übergeben wird nicht auf das Objekt festgelegt es schafft, so dass er privilegiert ist, Alle Methodendefinitionen sind dem Autor nicht bekannt.

Wenn ich diese Fabrik zu einer ES6-Klasse machen möchte, wie kann ich die Konstruktorparameter auf die gleiche Weise offenbaren?

let hack; 

class Blah { 
    constructor(a) { 
    //bad! 
    this.a = a; 
    //but even worse? 
    hack = a; 
    //instance method is not a class method 
    this.yell =() => console.log(a); 
    } 
    say() { 
    console.log(hack); 
    } 
} 

let blah = new Blah('hi'); 
blah.a; // => 'hi' 
blah.hack; // => 'undefined' 
blah.say(); // => 'hi' 
blah.yell(); // => 'hi' 
+0

[Dieser Artikel] (http://www.2ality.com/2016/01/private-data-classes.html) bietet einige Möglichkeiten, aber ich stimme grundsätzlich mit deceze überein: Sie machen sich zu viele Sorgen. : P Zum Beispiel hat Python überhaupt keine privaten Mitglieder; und es tuckert einfach gut, nur durch die Verwendung von Konvention. – Amadan

+1

@Amadan Python ist genau das, was mich zu meiner unten beschriebenen Ansicht gebracht hat; die Vorstellung von * "wir alle stimmen Erwachsenen hier zu, nur nicht berühren meine Privatsphäre m'kay" * ist so eine wichtige Lektion ... – deceze

Antwort

4

Wenn ich diese Fabrik eine ES6 Klasse wie kann ich die Konstruktorparameter auf die gleiche Art und Weise offenbaren machen wollte?

Sie können nicht. Aus dem gleichen Grund können Sie keine Konstruktorargumente für Prototypmethoden zugänglich machen: Scope.

Ihre Fabrikmethode unterscheidet sich nur sehr von dem, was eine Klasse tut. Sie können keine Klasse verwenden, um den gleichen Effekt zu erzielen, und das ist OK. Sie haben keine müssen Klassen nur verwenden, weil sie existieren.

2
this.yell =() => console.log(a); 

Dies ist im Wesentlichen, was Sie auch mit Ihrer aktuellen Fabrik tun. Sie geben ein neues Objekt mit einer bestimmten Instanzmethode zurück, die den bestimmten instanzspezifischen Wert schließt. Das ist der einzige Weg, um es zum Laufen zu bringen. Wenn Sie den Prototyp überhaupt für Methoden verwenden möchten, benötigen Sie , um this zu verwenden, um den instanzspezifischen Wert zu speichern, andernfalls gibt es keine Möglichkeit für die Methode auf Zugriff auf diesen Wert zu erhalten.

Nach all dem, IMO, "private" Werte sind extrem überbewertet, vor allem, wenn Sie sich bücken müssen, um sie passieren zu lassen. Am Ende sind sie nur für menschliche Programmierer nützlich, um nicht versehentlich "die Privatsphäre eines anderen zu berühren" und den Zustand zu stören. Zu diesem Zweck ist eine Namenskonvention oft vollkommen ausreichend, z.B. this.__my_private = a. Berühren Sie nicht __ Variablen, außer sie gehören Ihnen.

+0

100% ack. Umarme die Sprache. –