类本身上的Javascript getter和setter

类本身上的Javascript getter和setter,javascript,class,setter,getter,self,Javascript,Class,Setter,Getter,Self,声明js类时,我们可以为该类的属性定义getter和setter,如下所示: 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 我想知道

声明js类时,我们可以为该类的属性定义getter和setter,如下所示:

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
我想知道的是,如何定义类本身的getter和setter? 例如,foo=7将触发一个代码块,console.log(foo)将打印“foobar”。

您不能

foo = 7;

foo
重新分配给
7

你不能
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;
  }

}

有些语言在值被销毁或超出范围并最终被垃圾收集器清除时,也有一个
析构函数
规范,等等,但es6不提供这种功能。

一个问题:为什么?当您分配给变量时,该变量的旧值被完全忽略,它没有机会拦截。@AndrewLi我想创建实例具有操作逻辑的类。例如,vector2A+=vector2B,据我所知,我需要getter和setter来实现这一点,除非js有另一种定义的方法来实现这一点。@Barmar我想这是一个很好的替代方法,尽管这正是我试图避免的。希望js将来会支持这样的定义。你确定吗?我假设有一种可能性,因为foo.bar=7也没有将7分配给foo.bar。@Jrs.b这毫无意义。。。为什么
foo.bar=7
会将7分配给
foo.bar
?为什么分配
foo
不会改变
foo
?@Jrs.b这是因为它在访问属性
bar
时正在遍历对象。对象可以将其重定向到getter/setter。@Jrs.b我想您可以在
窗口中尝试。不过我不推荐使用它。@mpen如果
foo
是一个局部变量,那就没用了。