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
将创建一个新的函数对象,因此我不确定为什么您会期望它具有相同的静态属性。请记住,ES6class
主要是语法糖:
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
创建了一个新的函数对象,所以我不知道为什么您会期望它具有相同的静态属性。请记住,ES6class
主要是语法糖:
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
调用没有什么特别之处。是的,让它在我看来至少有点点击的原因是我刚刚在函数中添加了一个属性,并意识到绑定该函数会“丢失”该属性。不知何故,我从来没有“思考”过绑定的正确方式:/