绑定类失去了它的静态属性

时间:2018-03-13 23:09:55

标签: javascript ecmascript-6

鉴于

class someClass {
  constructor (str) {
    console.log('created', str);
  }
  static someStatic() {
  }
}

我们可以做到

const someBoundClass = someClass.bind(someClass, 'xxx');
const a = new someBoundClass(); // logs 'created xxx'
console.log(someClass.someStatic) // logs someStatic () {}
console.log(someBoundClass.someStatic) // logs undefined

幕后发生了什么导致我无法访问绑定类的静态属性?有没有办法在不丢失静态方法的情况下实现所需的绑定效果?

2 个答案:

答案 0 :(得分:2)

bind创建一个新的函数对象,所以我不确定为什么你会期望它具有相同的静态属性。请记住,ES6 class主要是语法糖:

function someClass(str) {
  if (!new.target) throw "constructor must be called with new";
  console.log('created', str);
}
someClass.someStatic = function() {};

var someBoundClass = someClass.bind(null, 'xxx');
console.log(someBoundClass === someClass) // false, of course

作为一种解决方法,您可以使用子类:

class someBoundClass extends someClass { constructor(...args) { super('xxx', ...args); }}
const a = new someBoundClass(); // logs 'created xxx'
console.log(someClass.someStatic) // logs someStatic () {}
console.log(someBoundClass.someStatic) // logs someStatic () {}

someBoundClass此处继承了someClass的静态属性。

答案 1 :(得分:0)

查看Javascript static vs instance, prototype keyword

将属性设置为对象,使用static时执行的操作以及向对象的每个实例添加方法之间存在差异,这可以通过使用someClass.prototype.someMethod或在您的仅删除static

这意味着,如果您尝试在undefined的{​​{1}}实例上调用someStatic,也会发生someClass

对于另一种方法,请看一下Bergi的答案。