[英]Binding a class loses it's static properties
给定
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
导致我无法访问绑定类上的静态属性的幕后发生了什么? 有什么方法可以在不损失静态方法的情况下实现所需的绑定效果吗?
好的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
。
在为对象设置属性,使用static
与将方法添加到对象的每个实例之间有区别,这可以通过使用someClass.prototype.someMethod
或在您的情况下通过删除static
。
这意味着undefined
也会发生,如果您尝试调用someStatic
上的实例someClass
,这是直接被实例化new someClass("xxx")
对于另一种方法,请看一下Bergi的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.