2

重複の可能性:
関数がコンストラクターとして呼び出されているかどうかを検出する方法は?

JavaScriptで、通常どおりに呼び出された場合と、新しいインスタンスを作成するために呼び出された場合とで動作が異なる関数が必要です。2つの機能が関連している場合と関連していない場合がある場合、さまざまな用途が考えられます。new関数が常に新しいインスタンスを作成するために使用される場合、1つの使用法は、コーダーが入力する必要がないようにすることです。

function MyClass(arg1, arg2) {
  if(/* not called with "new" */) return new MyClass(arg1, arg2);

  // instance initialization stuff here...

}

このように入力する必要はありません。入力var x = new MyClass(arg1, arg2)するだけで十分ですvar x = MyClass(arg1, arg2)(ただし、前者も間違っていません)。

可能な使用法のほんの一例。

これはできますか?もしそうなら、どのように?

4

3 に答える 3

5

関数がどのように呼び出されたかを完全に確認する方法はありませんが、次this instanceof MyClassのように使用することはかなり確実です。

if (this instanceof MyClass) {
    // Was called with `new`
} else {
    // Was called as regular function
}

ただし、エッジケースがあります。たとえば、MyClassの新しいインスタンスを作成してから実行できます。これにより、外部が。で呼び出されなかっMyClass.call(new MyClass)たため、誤検知が発生します。MyClassnew

于 2012-07-24T21:30:08.927 に答える
1

ここで考えられる唯一のオプションは、の値をテストすることですthis。あなたは試すかもしれません:

function MyClass(args) {
    var isInstance = this instanceof MyClass;
    // ...
}
于 2012-07-24T21:29:46.507 に答える
1
if(this instanceof MyClass)

おそらくあなたが探しているものです。.callとでだまされる可能性.applyがありますが、とにかく、インスタンスが渡された場合、オブジェクトの構築に問題はないはずです。

于 2012-07-24T21:29:56.773 に答える