【发布时间】:2016-11-17 13:46:03
【问题描述】:
我对 es2016 中的 class 功能有点困惑,尽管与 function 和 prototype 相比,它被认为只是用于创建类的语法糖,但在某些情况下的行为是不同的,特别是 - 类不能像函数一样被调用,而且看起来,如果不使用 toString 和 /^class/ @987654327,就无法确定函数是类构造函数还是简单函数@。
假设示例:
class Foo {
constructor () {
this.name = 'foo';
}
}
function Bar () {
this.name = 'bar';
}
function doSmth (anyArg) {
if (typeof anyArg === 'function') {
var obj = { someProp: 'qux' };
anyArg.call(obj);
return obj;
}
// ...
}
doSmth(Bar);
doSmth(Foo); // Class constructor Foo cannot be invoked without 'new'
是typeof 'function',但不能作为函数调用!好的。
这是我的两个问题:
- 有什么方法可以调用
Foo构造函数,与Bar相同,并覆盖this上下文? - 有什么方法可以检测到
anyArg是一个类的构造函数,这样我就可以在我的doSmth函数中以不同的方式处理它。如果没有toString和RegExp(在这种情况下性能损失会很大)。然后,我可以使用Reflect.construct初始化新实例,并使用Object.assign使用实例中的值扩展我的obj变量。
谢谢你,亚历克斯
【问题讨论】:
-
FWIW,对我来说,a) 不知道究竟收到了什么,b) 想要强制构建这样的对象。
标签: javascript es6-class