Javascript 绑定类会丢失它';静态特性

Javascript 绑定类会丢失它';静态特性,javascript,ecmascript-6,Javascript,Ecmascript 6,给定 我们能做到 class someClass { constructor (str) { console.log('created', str); } static someStatic() { } } 幕后发生了什么导致我无法访问绑定类的静态属性?有没有办法在不丢失静态方法的情况下实现所需的绑定效果?那么bind将创建一个新的函数对象,因此我不确定为什么您会期望它具有相同的静态属性。请记住,ES6class主要是语法糖: const someBoundClass

给定

我们能做到

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

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

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

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
作为一种解决方法,您可以使用子类化:

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

这里的
someBoundClass
继承了
someClass

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

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
作为一种解决方法,您可以使用子类化:

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
此处的
someBoundClass
继承了
someClass

的静态属性,请查看

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

这意味着,如果您尝试调用
someClass
实例上的
someStatic
,也会出现
undefined
,该实例由
newsomeclass(“xxx”)
直接实例化

另一种方法是看Bergi的答案。

看看

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

这意味着,如果您尝试调用
someClass
实例上的
someStatic
,也会出现
undefined
,该实例由
newsomeclass(“xxx”)
直接实例化


另一种方法是看Bergi的答案。

在本例中,
bind()
似乎不仅仅创建函数。例如,如果没有
new
@Mark\M,您就不能调用
someBoundClass
,这是因为您也不能在没有
new
的情况下调用原始的
someClass
,因此调用绑定函数仍然会抛出错误。这个
bind
调用没有什么特别之处。是的,让它在我看来至少有点点击的原因是我刚刚在
函数中添加了一个属性,并意识到绑定该函数会“丢失”该属性。不知何故,我从未“思考”过有关
bind
的正确方法。显然:/在这种情况下,
bind()
似乎不仅仅是创建一个函数。例如,如果没有
new
@Mark\M,您就不能调用
someBoundClass
,这是因为您也不能在没有
new
的情况下调用原始的
someClass
,因此调用绑定函数仍然会抛出错误。这个
bind
调用没有什么特别之处。是的,让它在我看来至少有点点击的原因是我刚刚在
函数中添加了一个属性,并意识到绑定该函数会“丢失”该属性。不知何故,我从来没有“思考”过绑定的正确方式:/