鉴于
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
幕后发生了什么导致我无法访问绑定类的静态属性?有没有办法在不丢失静态方法的情况下实现所需的绑定效果?
答案 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的答案。