ES6:如何从实例访问静态 getter

问题描述 投票:0回答:2

如何从实现该 getter 的类的实例访问静态 getter?

例如,我有这门课:

class Component {
  static get isComponent() { return true; }

  constructor() {}
}

const c = new Component();

如何从“Component”类的“c”“isComponent”调用? 我四处阅读,发现的都是类似的东西:

Object.getPrototypeOf(c).isComponent

但这对我的情况不起作用,因为组件原型对象中没有“isComponent”方法。如果我像这样编写类,上面的代码就可以工作:

Component.prototype.isComponent = () => { return true; }

但这不是我想要编写课程的方式。我缺少什么? tnx

javascript class static ecmascript-6 getter
2个回答
30
投票

static
成为构造函数的属性,您可以通过
constructor
属性在实例上访问它:

console.log(c.constructor.isComponent);

class Component {
  static get isComponent() { return true; }

  constructor() {}
}

const c = new Component();
console.log(c.constructor.isComponent); // true

当然,这取决于

constructor
没有被弄脏。 :-) 在
class
语法之前,您会看到人们总是忘记在继承层次结构中正确设置
constructor
。值得庆幸的是,使用
class
语法,它会自动处理,因此人们忘记不再是问题。

理论上,实例可能有一个“自己的”属性,遮盖原型上的属性。因此,如果这是一个问题,您可以转到原型:

constructor

console.log(Object.getPrototypeOf(c).constructor.isComponent);

或者,如果你知道它是什么构造函数,你可以直接访问源代码:

class Component { static get isComponent() { return true; } constructor() {} } const c = new Component(); console.log(Object.getPrototypeOf(c).constructor.isComponent); // true

console.log(Component.isComponent);

...但前提是您事先知道

class Component { static get isComponent() { return true; } constructor() {} } // const c = new Component(); <== Don't need it console.log(Component.isComponent); // true

是您想要的构造函数。

    


0
投票

Component

所以不要在实例上调用它,而是在类本身上调用它。这听起来很合乎逻辑,因为静态变量没有 this 变量。静态有一个对于类的所有实例都相同的字段变量。

示例是计数器。在您的类上声明一个静态计数器字段变量,并在您的类的实例中更新此计数器,并注意此变量将递增。

© www.soinside.com 2019 - 2024. All rights reserved.