16
function F() {
    return function() {
        return {};
    }
}

var f = new F();
f instanceof F; // returns false

私が理解している限り、作業したい場合は、コンストラクターinstanceofから戻る必要があります。thisしかし、コンストラクターが関数を返すようにしたいのですが、に割り当てることはできませんthis

それで、これは本当に不可能ですか、それともf = new F()関数を返し、それでもf instanceof Ftrueを返すために何らかの方法で行うことができますか?

4

4 に答える 4

8
function F() {
    var r = function() {
        return {};
    };

    r.__proto__ = this.__proto__;
    return r;
}

var f = new F();
f instanceof F;
true
f();
Object

のブラウザでのみ動作します__proto__

于 2012-04-26T21:05:59.153 に答える
5

instanceof Fもちろん、を設定することで、すべての機能をそのように見せることもできますF.prototype = Function.prototype;

残念ながら、ECMAScript では関数サブクラスを作成できないようです。

__proto__ただし、非推奨のプロパティを使用して Gecko で実行できます。

function F() {
    function f() {
        return {};
    }
    f.__proto__ = F.prototype;
    return f;
 }
 F.prototype.__proto__ = F.__proto__;
于 2012-04-26T21:09:26.910 に答える
1

今日これに遭遇した人には、ES6/2015 で非推奨の__proto__プロパティを回避するために使用できる新しい構文があります。Object.setPrototypeOf. MDNは、これは低速で費用のかかる操作であると警告していることに注意してください。

function F() {
    const f = function() {
        return {};
    }
    Object.setPrototypeOf(f, F.prototype);
    return f;
}

var f = new F();
f instanceof F; // returns true
f(); // returns {}

コンストラクターで値を初期化したい場合は、少し奇妙になることにも注意してください。返す関数の小道具としてそれらを設定する必要がありますが、後でプロトタイプに追加すると、それらは「this」として参照されます。例えば

function F() {
    const f = function() {
        return {};
    }
    f.favoriteBand = 'The Books';
    Object.setPrototypeOf(f, F.prototype);
    return f;
}
F.prototype.getFavoriteBand = function(){ return this.favoriteBand; }

var f = new F();
f.getFavoriteBand() // returns 'The Books'
于 2016-04-04T22:51:26.740 に答える
0

あなたの例では、Fはコンストラクターではなく、匿名のコンストラクターを返す関数であり、それを新しく呼び出します。instanceofはプロトタイプチェーンを確認することで機能するため、プロトタイプを正しく設定していないため、コードは機能しません。

このページには、JavaScriptコンストラクターとサブクラス化の方法についての優れた説明があります。

次のコードを見て、それが役立つかどうかを確認してください。

function F() {
    this.whoami = 'F';
    this.whatami = 'F';

}

function Sub() {
 this.whoami = 'G';
}

Sub.prototype = new F();

function G() {
    return new Sub;
}

var f = new G();
console.log(f instanceof F); // returns false
console.log(f.whoami);
console.log(f.whatami);
​
于 2012-04-26T21:04:39.293 に答える