2016-12-04 36 views
8

Chcę, aby użytkownik ustawiał tylko określone właściwości obiektu, ale w tym samym czasie, gdy obiekt powinien być zbudowany z niestandardowej klasy.Powracanie serwera proxy ES6 z konstruktora klasy ES6

Przykładowo

var row = new Row({ 
    name : 'John Doe', 
    email : '[email protected]' 
}, Schema); 

row może mieć metod. Ale gdy użytkownik próbuje ustawić row.password, nie są one dozwolone.

Jednym ze sposobów jest użycie new Proxy zamiast new Row, ale wtedy stracimy wszystkie fajne rzeczy, które robimy wewnątrz klasy . Chcę, aby new Row zwrócił obiekt proxy z odwołaniem this jako cel proxy.

Ktoś ma jakieś pomysły na ten temat? Jeśli znasz numer mongoose, jak to robi mongoose?

+2

Czy możesz opisać problem, który próbujesz rozwiązać w dużo bardziej szczegółowy sposób? Wygląda na to, że opisujesz jakieś możliwe rozwiązanie (używając proxy), ale tak naprawdę nie opisujesz tego, co próbujesz osiągnąć. – jfriend00

Odpowiedz

3

Możesz to zrobić bez korzystania z serwerów proxy.

W swojej konstruktora klasy można zdefiniować właściwość hasło tak:

constructor(options, schema) { 
    this.name = options.name; 
    this.email = options.email; 
    Object.defineProperty(this, 'password', { 
     configurable: false, // no re-configuring this.password 
     enumerable: true, // this.password should show up in Object.keys(this) 
     value: options.password, // set the value to options.password 
     writable: false // no changing the value with this.password = ... 
    }); 
    // whatever else you want to do with the Schema 
} 

można znaleźć więcej informacji o tym, jak wykorzystać to na MDN za Object.defineProperty() stronie.

+0

Moim pragnieniem jest umożliwienie obserwowania operatorów własności obiektów i macierzy. Oznacza to wszelkie nieznane imię. Zwrócenie proxy w konstruktorze sprawia, że ​​definiowanie właściwości według nazwy nie jest możliwe. –

5

Jeśli proxy ma się dobrze, jednym z możliwych sposobów ograniczenia ustawionej funkcjonalności jest zwrócenie instancji Proxy ES6.

Domyślnie konstruktor w javascript zwraca automatycznie obiekt this, ale można zdefiniować i zwrócić niestandardowe zachowanie, tworząc obiekt docelowy jako this. Należy pamiętać, że metoda set w proxy powinna zwracać wartość boolowską.

MDN : The set method should return a boolean value. Return true to indicate that assignment succeeded. If the set method returns false, and the assignment happened in strict-mode code, a TypeError will be thrown.

class Row { 
    constructor(entry, schema) { 
    // some stuff 

    return new Proxy(this, { 
     set(target, name, value) { 
     let setables = ['name', 'email']; 
     if (!setables.includes(name)) { 
      throw new Error(`Cannot set the ${name} property`); 
     } else { 
      target[name] = value; 
      return true; 
     } 
     } 
    }); 
    } 

    get name() { 
    return this._name; 
    } 
    set name(name) { 
    this._name = name.trim(); 
    } 
    get email() { 
    return this._email; 
    } 
    set name(email) { 
    this._email = email.trim(); 
    } 
} 

Więc teraz jesteś nie wolno ustawić właściwości non-setable według pełnomocnika.

let row = new Row({ 
    name : 'John Doe', 
    email : '[email protected]' 
}, Schema); 

row.password = 'blahblahblah'; // Error: Cannot set the password property 

Możliwe jest również zachowanie niestandardowe dla metody get.

Uwaga: Według MDN w tej chwili, kompatybilność dla handler.set() przeglądarka nie jest jeszcze oczywiste. Jednak działa to dla mnie na Node v8.1.3

+0

Błąd: "Nieoczekiwany nowy token" ?! Nie sądzę, możesz użyć "nowy" w konstruktorze, a także nie lubię "zwracać Proxy"? –

+1

Wow, wygląda na to, że to działa ?! Miły. Wyglądało na to, że konstruktorzy nie zwracają nowego Proxy w innych próbach, więc dziękuję za ten przykład. –

+0

@MasterJames Bez obaw. Tak, działa dla mnie na Node v8.1.3. – hallaji