2016-11-15 12 views
0

При объявлении класса JS мы можем определить методы получения и установки для свойств этого класса, как так:Javascript Геттеры и сеттеры на самом классе

class Foo{ 

    get bar(){ 
     return 'foo-bar'; 
    } 

    set bar(n){ 
     this.baz = n * 10; 
    } 

} 

let foo = new Foo(); 

console.log(foo.bar) //foo-bar 

foo.bar = 7; 
console.log(foo.baz) //70 

Что мне было интересно это, как бы я определить методы получения и установки на сам класс? Так, например, foo = 7 вызовет блок кода, а console.log (foo) напечатает 'foo-bar'.

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects#Defining_getters_and_setters – saj

+1

Один вопрос: почему? – Li357

+0

Когда вы назначаете переменную, старое значение переменной полностью игнорируется, у нее нет возможности перехвата. – Barmar

ответ

0

Вы не можете.

foo = 7; 

будет переназначить foo к 7.

+0

Уверены ли вы в этом? Я предположил, что существует такая возможность, поскольку foo.bar = 7 не присваивает 7 foo.bar. –

+0

@ Jrs.b, что не имеет смысла ... почему 'foo.bar = 7' присваивать 7' foo.bar'? Почему присвоение 'foo' * не изменяет' foo' *? – Li357

+0

@ Jrs.b Это потому, что он проходит через объект, когда он обращается к свойству 'bar'. Объект может перенаправить его на геттер/сеттер. – Barmar

2

Вы не можете. foo = означает, что вы присваиваете значение переменной foo. Лучшее, что вы можете сделать, это использовать конструктор для запуска некоторого кода при создании экземпляра вашего класса.

class Foo{ 

    constructor(){ 
    console.log('A Foo instance has been created!'); 
    } 

    get bar(){ 
    return 'foo-bar'; 
    } 

    set bar(n){ 
    this.baz = n * 10; 
    } 

} 

Некоторые языки также имеют destructor спецификацию всякий раз, когда значение разрушенную или из объема и в конечном итоге очищены от сборщика мусора, и т.д., но ES6 не обеспечивает такую ​​функциональность.