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

时间:2017-01-02 12:15:26

标签: javascript class static ecmascript-6 getter

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

例如,我有这个类:

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

  constructor() {}
}

const c = new Component();

我怎样才能从" c" " isComponent" "组件"类? 我四处读书,所有我发现的都是这样的:

Object.getPrototypeOf(c).isComponent

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

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

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

1 个答案:

答案 0 :(得分:15)

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
&#13;
&#13;
&#13;

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