私は es2016 の機能と少し混乱していますが、 と と比較してclass
、クラスを作成するための単なる構文糖衣であると想定されていますが、場合によっては動作が異なります。特に、クラスを呼び出すことはできません関数と同じで、 と を使用せずに、関数がクラス コンストラクターであるか単純な関数であるかを調べる方法はないようです。function
prototype
toString
/^class/
RegExp
次の例を想定します。
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'
が、関数として呼び出すことはできません! 良い。
そして、ここに私の2つの質問があります:
- オーバーライドされたコンテキストと
Foo
同じようにコンストラクター関数を呼び出す方法はありますか?Bar
this
anyArg
関数で別の方法で処理できるように、クラスのコンストラクターであることを検出できる方法はありますかdoSmth
。なし(この場合toString
、パフォーマンスのペナルティが非常に大きくなるため)。次に、新しいインスタンスを初期化し、インスタンスからの値で変数を拡張するために使用できます。RegExp
Reflect.construct
Object.assign
obj
ありがとう、アレックス