2017-01-07 14 views
6

jakie są w rzeczywistości metody pobierające i ustawiające w definicji klasy ES6? czy są one prototypowymi rekwizytami? na przykład:Co to jest getter i seter klasy ES6?

class Person{ 
    constructor(){}; 
    get name(){ 
    return 'jack'; 
    } 
    set name(){ 
    // ??? 
    } 
} 

czy jest to równe Person.prototype.name = 'jack';

i kolejne pytanie, ja widziałem przykłady ustawiaczy który wykorzystuje rekwizyt instancji niczym:

class Person{ 
    constructor(){ 
    this._name = 'jack'; 
    }; 
    get name(){ 
    return this._name; 
    } 
    set name(val){ 
    this._name = val; 
    } 
} 

ja nie chcę tego robić w ten sposób, chcę coś takiego:

class Person{ 
    constructor(){}; 
    get name(){ 
    return 'jack'; 
    } 
    set name(val){ 
    // like this 
    // name = val; 
    } 
} 

co może być Gotowe?

+0

https: //developer.mozilla. org/en-US/docs/Web/JavaScript/Reference/Functions/get i https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set –

+0

Co to jest "name" in "name = val' w twoim ostatnim przykładzie? Nie rozumiem. Czy możesz wyjaśnić, co próbujesz osiągnąć? –

+0

Możliwy duplikat [Czym są moduły pobierające i ustawiające w klasach ECMAScript 6?] (Https://stackoverflow.com/questions/28222276/what-are-getters-and-setters-for-in-ecmascript-6-classes) – Drenmi

Odpowiedz

9

Tak, można to zrobić: Wystarczy kropla składnię setter/getter i dodać obiekt do klasy podczas inicjalizacji zamiast: istnieje

class Person{ 
    constructor(name){ 
     this.name = name; 
    } 
} 

Przełącznik/składnia setter getter dla właściwości, które muszą być obliczane na podstawie inne właściwości, takie jak nieruchomości z okręgu danego radiusarea:

class Circle { 
    constructor (radius) { 
     this.radius = radius; 
    } 
    get area() { 
     return Math.PI * this.radius * this.radius; 
    } 
    set area (n) { 
     this.radius = Math.sqrt(n/Math.PI); 
    } 
} 

lub uzyskanie pełnej nazwy Person obiektu z firstName i lastName właściwości. Masz pomysł.

+0

wiemy, że klasa jest skrótem dla prototypu, w metodzie konstruktorskiej możemy zdealizować obiekt. jednak chcę zdefiniować rekwizyt w swoim prototypie w definicji klasy, ale poza metodą konstruktora. – feiyuerenhai

+0

bez użycia własnej właściwości instancji – feiyuerenhai

+1

ustawiacz obszaru powinien mieć postać 'this.radius = Math.sqrt (n/Math.PI);' – alphakevin

2

Zgodnie z MDN, składnia get powiązuje właściwość obiektu z funkcją, która zostanie wywołana, gdy ta właściwość zostanie sprawdzona.

Tutaj zwracasz tylko ciąg "jack", który nie jest wiążący dla żadnej własności.

ciekawe console.log (Person.prototype.name) loguje Jackowi

Ale Person.hasOwnProperty (nazwa) rejestruje fałszywe

również raz tworzymy instancję osoby nazywają to znaczy const x = new Person() ;

console.log (x.name) -> to wyrzuca błąd, nie mogę odczytać właściwość x.name ponieważ x.hasOwnProperty (nazwa) jest fałszywe

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get