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

Gio*_*uno 16 javascript getter static class ecmascript-6

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

例如,我有这个类:

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

  constructor() {}
}

const c = new Component();
Run Code Online (Sandbox Code Playgroud)

我如何从"组件"类的"c""isComponent"调用?我四处读书,我发现的就是这样的:

Object.getPrototypeOf(c).isComponent
Run Code Online (Sandbox Code Playgroud)

但这不适用于我的情况,因为Component原型对象中没有"isComponent"方法.如果我像这样编写类,上面的代码可以工作:

Component.prototype.isComponent = () => { return true; }
Run Code Online (Sandbox Code Playgroud)

但这不是我想写课的方式.我错过了什么?TNX

T.J*_*der 17

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

console.log(c.constructor.isComponent);
Run Code Online (Sandbox Code Playgroud)

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

  constructor() {}
}

const c = new Component();
console.log(c.constructor.isComponent); // true
Run Code Online (Sandbox Code Playgroud)

当然,这依赖于constructor没有陷入困境.:-)在class语法之前,你会发现人们忘记constructor在继承层次结构中忘记设置.值得庆幸的是,使用class语法,它会自动处理,因此人们忘记不再是一个问题.

当然,实例可能具有"自己的" constructor属性,遮蔽原型上的属性.所以,如果这是一个问题,你可以去原型:

console.log(Object.getPrototypeOf(c).constructor.isComponent);
Run Code Online (Sandbox Code Playgroud)

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

  constructor() {}
}

const c = new Component();
console.log(Object.getPrototypeOf(c).constructor.isComponent); // true
Run Code Online (Sandbox Code Playgroud)


当然,如果你知道它是什么构造函数,你可以直接去源:

console.log(Component.isComponent);
Run Code Online (Sandbox Code Playgroud)

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

  constructor() {}
}

// const c = new Component(); <== Don't need it
console.log(Component.isComponent); // true
Run Code Online (Sandbox Code Playgroud)

...但当然,只有事先知道这Component是你想要的构造函数.