2015-01-29 10 views
76

Ich bin verwirrt, was der Punkt der Getters und Setter in ECMAScript 6 Klassen sind. Was ist der Zweck? Unten ist ein Beispiel, das ich mich beziehe:Was sind Getter und Setter für ECMAScript 6-Klassen?

class Employee { 

    constructor(name) { 
     this._name = name; 
    } 

    doWork() { 
     return `${this._name} is working`; 
    } 

    get name() { 
     return this._name.toUpperCase(); 
    } 

    set name(newName){ 
     if(newName){ 
      this._name = newName; 
     } 
    } 
} 
+0

Es ist ähnlich wie in C#, wenn Sie darüber wissen. –

+0

Related: [Was ist das Argument für die Verwendung von ES6 Getter und Setter über getProperty/setProperty Konvention?] (Http://Stackoverflow.com/q/32114468/1048572) – Bergi

+0

Guter Artikel, der genau dies erklärt, finden Sie unter: https://coryrylan.com/blog/javascript-es6-class-syntax "In unserer Klasse oben haben wir einen Getter und Setter für unsere Namenseigenschaft. Wir verwenden '_' Konvention, um ein Hintergrundfeld zu erstellen, um unsere Namenseigenschaft zu speichern. Mit out Jedes Mal, wenn get oder set aufgerufen wird, würde dies zu einem Stack-Überlauf führen "... Es spricht auch davon, dass die Variable nicht wirklich" privat "ist, aber es gibt zahlreiche neue Möglichkeiten, private Vars in JS-Klassen zu erstellen; Mein Favorit ist nur Typescript, aber ich habe den Symbol-Ansatz zu – webdevinci

Antwort

83

Diese Setter und Getter können Sie die Eigenschaften direkt verwenden (ohne die Klammer mit)

var emp = new Employee("TruMan1"); 

if (emp.name) { 
    // uses the get method in the background 
} 

emp.name = "New name"; // uses the setter in the background 

Dies ist nur zu setzen und den Wert der Immobilie zu erhalten.

+1

Meinen Sie Eigentum statt Attribut? Etwas verwirrend für mich – Krizzu

+0

Gutes Auge, @Krizzu. Attribute existieren in JavaScript und sind _komplett_ verschiedene Dinge als Eigenschaften. Die Antwort bezieht sich in der Tat auf Eigenschaften und nicht auf Attribute. Ich habe die Antwort bearbeitet. Ich glaube nicht, dass der Beantworter etwas dagegen hat. :) –

+0

Ich bin nicht ganz sicher, dass dies wirklich ein solcher Vorteil ist, verbirgt es irgendwie die Vorstellung Setter/Getter zu verwenden. Ein Client einer Klasse kann denken, dass er Eigenschaften direkt verwendet, wo es nicht angemessen ist, aber ich stimme zu, dass er das Prinzip der Information/Detail-Verbergung beibehält. Vielleicht daher, wenn wir dies verwenden macht es Nutzung einfacher und ich muss nur mehr daran gewöhnen ... –

36

Getter und Setter in ES6 dienen dem gleichen Zweck, dass sie in anderen Sprachen zu tun ... einschließlich ES5. ES5 erlaubt bereits Getter und Setter über Object.defineProperty, obwohl sie weniger sauber und mehr umständlich zu verwenden sind.

Getter und Setter ermöglichen es Ihnen, die standardmäßige Eigenschaftenzugriffsnotation für Lese- und Schreibvorgänge zu verwenden und dennoch die Möglichkeit zu erhalten, die Eigenschaft ohne explizite Getter- und Setter-Methoden abzurufen und zu mutieren.

In der Klasse Employee oben, würde dies bedeuten, Sie name Eigenschaft wie folgt zugreifen können:

console.log(someEmployee.name); 

Es wäre aussehen wie eine normale Eigenschaft Zugang, aber es wäre toUpperCase auf den Namen tatsächlich nennen vor es zurückgeben. In ähnlicher Weise dies zu tun:

someEmployee.name = null; 

die Setter zugreifen würde, und es würde die interne _name Eigenschaft wegen der Schutzklausel eingeführt in name ‚s Setter nicht ändern.

Siehe auch die allgemeine Frage Why use getters and setters? für weitere Informationen darüber, warum die Funktionalität des Memberzugriffs geändert werden kann, ist nützlich.

+0

verwendet Sehr klare Erklärung. Vielen Dank! –

0

ES6 Getter und Setter haben eine wesentlich andere Motivation als ähnliche Konzepte in Java.

In Java erlauben Getter und Setter einer Klasse, eine JavaBean zu definieren. Der Punkt von Getter und Setter ist, dass es der Bean erlaubt, eine vollständig orthogonale "Schnittstelle" von der von öffentlichen Feldern implizierten zu haben. So kann ich ein Feld "name" haben, das ist keine JavaBean-Eigenschaft, und ich kann eine JavaBean-Eigenschaft "Adresse", die kein Feld ist.

JavaBean Eigenschaften sind auch durch Tausende von Frameworks (Hibernate zum Beispiel) über Java-Reflektion "erkennbar". Daher sind Getter und Setter Teil einer Standardmethode zum Aussetzen von Bean-Eigenschaften.

Getters und Setter, die Funktionen sind, haben auch den Wert, dass sie die Implementierung "abstrahieren". Es kann entweder ein Feld oder ein berechneter ("synthetischer") Wert sein. Wenn ich also eine Bean-Eigenschaft namens "Postleitzahl" habe, beginnt diese als gespeicherte Zeichenfolge. Nun nehme ich an, ich möchte es zu einem Wert ändern, der aus Adresse/Stadt/Staat berechnet wird?

Wenn ich ein Feld verwenden, dieser Code bricht:

 String zipcode = address.zipcode(); 

Aber wenn ich einen Getter zu verwenden, das nicht bricht:

 String zipcode = address.getZipcode(); 

JavaScript nicht so etwas wie Java Beans hat. Soweit ich gelesen habe, ist der beabsichtigte Wert von GET und SET auf die oben genannten "synthetischen" (berechneten) Eigenschaften beschränkt.

Aber es ist etwas besser als Java in dem, während Java nicht erlaubt Ihnen, ein "Feld" in eine Methode kompatibel zu konvertieren, ermöglicht ES6 GET und SET das.

Das heißt, wenn ich:

 var zipcode = address.zipcode; 

Wenn ich zipcode ändern ruft eine Standard-Objekt-Eigenschaft auf einen Getter aus ist, der obige Code jetzt die GET-Funktion.

Beachten Sie, dass, wenn ich nicht GET in der Definition enthalten waren, das die zipcode GET-Methode nicht aufrufen würde. Stattdessen würde es der var nur die Funktion zipcode zuweisen.

Also ich denke, dies sind einige wichtige Unterschiede zwischen Java und JavaScript ES6 Getters und Setter zu verstehen.