1

Fooオブジェクトを作成するという名前のjsに「クラス」(関数)があります。非常に頻繁にnew使用されるため、新しいインスタンスを作成するときにkeywoardを使用する必要がないようにします。Foo(something);の代わりにnew Foo(something);

私はこれをFirefoxで動作させることができました:

function Foo(arg) {
    if (this instanceof Window)
        return new Foo(arg);

    //Object construction here.
    this.bar = "Hello " + arg;
}

これで、Fooを関数として呼び出すだけで、Fooのインスタンスを作成できます。

console.log(Foo("World").bar); //Output "Hello World" in console.

これはFFで機能していますが、Chromeでは機能せず、IEのテストはまだ行っていません。

クロームの問題は、それwindowが本当にDOMWindowクロームのタイプであるということです

Uncaught ReferenceError: Window is not defined

そしてthis instanceof DOMWindow、何らかの理由でそれが与えるので、クロムでは動作しません:

ReferenceError: DOMWindow is not defined

私も使ってみましたが!(this instanceof Foo)typeof thisいつもあげているよう"object"です。

すべてのブラウザでnew呼び出すときにキーワードが省略されているかどうかを確実に検出するにはどうすればよいですか?Foo

更新:動作しますが、実際の機能!(this instanceof Foo)に迷いがありました。return thisFoo

4

4 に答える 4

2

私はテストしていませんが、おそらくこのようなものが機能するでしょうか?

var realWindow = this;

function Foo(arg) {
    if (this === realWindow)
        return new Foo(arg);

    //Object construction here.
    this.bar = "Hello " + arg;
}

realWindowもちろん、との衝突の可能性を回避するために、スコープ外で宣言されていることを確認する必要がthisあります。

一般的に、これ賢い方法ですが、タイピングの数文字を節約するためだけに行うことはお勧めしません。それは将来の開発者のためにコードを曖昧にし、一般的には良い習慣ではありません。

于 2012-05-07T20:55:49.580 に答える
2

これがFooのインスタンスであることをテストすると、Chrome 20、FF 12、およびIE 8で機能し、正常に機能するはずです。

function Foo(arg) {
    if (!(this instanceof Foo)) return new Foo(arg);

    //Object construction here.
    this.bar = "Hello " + arg;
}

var foo = Foo('World');
var baz = new Foo('Baz');

console.log(foo.bar);
console.log(baz.bar);

フィドルとして:http://jsfiddle.net/YSEFK/

于 2012-05-07T20:59:37.410 に答える
1

状態を反転するのはどうですか?

function Foo(arg) {
    if (!(this instanceof Foo))
        return new Foo(arg);

    //Object construction here.
    this.bar = "Hello " + arg;
}
于 2012-05-07T21:01:25.040 に答える
0

これを行う方法は、現在のインスタンスをそれ自体のタイプと照合することです。

function Foo(...args...) {
    if (!(this instanceof Foo)) {
        return new Foo(...args...);
    }
    ...do stuff...
}

グローバルオブジェクトをチェックしようとする手間を省き、ほとんどすべてのコンテキストで機能します(ただし、他のコンテキストでは意味がない場合があります)。

var a = {};
Foo.call(a);

これは何を返す必要がありますか?私の例では、新しいインスタンスを返しますが、新しいFooインスタンスを作成したくないFoo場合もあります。

于 2012-05-07T21:01:09.827 に答える