【问题标题】:Binding a class loses it's static properties绑定一个类会失去它的静态属性
【发布时间】:2018-03-13 23:09:55
【问题描述】:

给定

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

幕后发生了什么导致我无法访问绑定类的静态属性?有没有什么方法可以在不丢失静态方法的情况下达到想要的绑定效果?

【问题讨论】:

    标签: javascript ecmascript-6


    【解决方案1】:

    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的静态属性。

    【讨论】:

    • 在这种情况下,bind() 似乎没有只是创建一个函数。例如,如果没有new,你就不能打电话给someBoundClass
    • @Mark_M 那只是因为你不能在没有new 的情况下调用原始的someClass,所以调用绑定函数仍然会抛出。这个bind 电话没有什么特别之处。
    • 是的,让它对我来说至少点击一点的事情是,当我刚刚将一个属性添加到 function 并意识到绑定该函数“丢失”该属性时。不知何故,我从来没有清楚地“想到”bind 的正确方式:/
    【解决方案2】:

    看看Javascript static vs instance, prototype keyword

    将属性设置为对象之间存在区别,使用static 和向对象的每个实例添加一个方法,这可以通过使用someClass.prototype.someMethod 或在您的情况下仅删除static.

    这意味着undefined 也会发生,如果您尝试在someClass 的实例上调用someStatic,该实例由new someClass("xxx") 直接实例化。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-10
      • 2021-08-26
      • 2012-09-10
      • 2012-10-15
      • 2013-08-17
      • 2014-01-29
      • 2019-02-17
      相关资源
      最近更新 更多