1

この小さな宝石は、私に少し頭痛の種を与えています. 次のように、関数を返すオブジェクトを作成するとします。

function Bar(prop) {
    this.prop = prop;
    var that = this;
    return function() {
        this.prop = that.prop;
    }
}

var bar = new Bar();
console.log(bar instanceof Bar)​;

Bar()ご覧のとおり、関数を返します。今、Bar() instanceof Barfalseを返しますが、これは私が望むものではありません。new Bar()aが のインスタンスかどうかを確認するにはどうすればよいBarですか? これは可能ですか?

4

2 に答える 2

3

コンストラクターからオブジェクトを返すと、コンストラクターによって自動的に生成されたインスタンスを返す代わりに、そのオブジェクトが使用されます少し抽象的なので、私の要点を示す例を次に示します。

function Foo() {}
function Bar() {
    return new Foo();
}
f = new Foo();
console.log(f instanceof Foo); //true
b = new Bar();
console.log(b instanceof Bar); //false
console.log(b instanceof Foo); //true

JavaScript では、関数を含むすべてがオブジェクトであるため、foo.bar関数が関数を返すということは、呼び出したときに、新しいインスタンスではなく、new foo.bar()によって返された関数を受け取ることを意味します。foo.barfoo.bar


何をしようとしているのか正確にはわかりませんが、コンテキストで使用するだけで、関数がオブジェクト初期化子として呼び出されているのか、関数として呼び出されているのかを確認できます。instanceofこのパターンは、オブジェクトの初期化を強制するためによく使用されます。

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

これによりFoo、関数として呼び出すことができ、新しいFooインスタンスを返すことができます:

a = new Foo(); //a instanceof Foo
b = Foo(); //b instanceof Foo
于 2012-05-10T15:20:27.540 に答える
0

なぜあなたがやっていることをやりたいのか完全にはわかりませんが、問題が何であるかはわかります。

「test」のスコープでは、 this.bar は、この関数を実行した結果として返される関数ではなく、関数 bar(prop) です (それが理にかなっている場合)。ただし、 new this.bar('hi') は最初に bar('hi') を実行し、コンストラクタとして機能する無名関数を返します。

つまり、匿名関数から作成されたインスタンスを別の関数と比較しているため、instanceof は正しく false を返します。

次のログは「true」ですが、探しているものではない可能性があります。

function foo() {
    this.test = function() {
        var cls = this.bar('hi');
        console.log(new cls() instanceof cls);
    };

    this.bar = function bar(prop) {
        this.prop = prop;
        var that = this;
        return function() {
            this.prop = that.prop;
        }
    }
}

var test = new foo();
test.test();
于 2012-05-10T15:21:38.447 に答える