1

JavaScript で instanceof を使用すると問題が発生しました。

var MyObject = function() {
    var prop = {}; 
    return prop;
}

var testObject = new MyObject();
console.log(testObject instanceof MyObject); // return false;

Instanceof は、予想される MyObject ではなく Object を返します。「return prop」を削除できません。testObject の型 MyObject を取得するにはどうすればよいですか?

助けてくれてありがとう

編集:私の質問が次のように見えても:コンストラクターが function または object を返す JavaScript クラスの何が問題なのか、 new が何をするかについてもう少し説明が必要でした。

4

4 に答える 4

2

newオペレーターが何をするかに基づいて、おそらくステップに分割できます

var MyObject = function () {
    var prop = {};
    return prop;
}

var testObject = Object.create(MyObject.prototype);
var result = MyObject.call(testObject);
// result is the actual output of new MyObject();
result = result && typeof result === 'object' ? result : testObject;

console.log(testObject instanceof MyObject); // returns true
console.log(result instanceof MyObject); // returns false because it's actually prop (i.e. {})

私たちが行ったことは、newを実行したときに発生する実際の手順に置き換えたことですnew。以下は手順です

  1. プロトタイプが関数 (コンストラクター) のプロトタイプと同じであるオブジェクトを作成します。これは何var testObject = Object.create(MyObject.prototype);

  2. thisこの新しく作成されたオブジェクトに設定して (コンストラクター) 関数を呼び出します。これが何をするかvar result = MyObject.call(testObject);(最初のパラメーターthisは MyObject 呼び出しの値です)

  3. 関数が null 以外のオブジェクトを返す場合、new ...式はその値に評価されます。それ以外の場合は、ステップ 1 で作成されたオブジェクトに評価されます。


質問については、最後のステップの null 以外の戻り値 (prop = {}) が、ステップ 1 で返されたオブジェクトの型を実際にテストする際に邪魔になっていました。それをコンポーネント ステップに分割することで、作成されたオブジェクトを取得できます (およびinstanceOf テストでそれを使用します)

于 2015-08-03T15:53:07.893 に答える
0

これを試してみると、その理由がわかります。

var MyObject = function() {
    var prop = { testProp: 1 }; 
    return prop;
}

var testObject = new MyObject();
console.log(testObject.testProp); // returns 1;

クラスコンストラクターでオブジェクトを返す場合、その新しくインスタンス化されたオブジェクトは、返されたオブジェクトになります。プリミティブ値を返すと、代わりに、当初の期待どおりにオブジェクトのインスタンスになります。

したがって、propオブジェクトに Object.prototype.toString() メソッドを適用し、代わりにその結果 (文字列プリミティブ) を返すと、目的の MyObject が返されます。

var MyObject = function() {
    var prop = {}; 
    return prop.toString();
}

var testObject = new MyObject();
console.log(testObject instanceof MyObject); // returns true;
于 2015-08-03T15:28:06.860 に答える
-3

それはあなたがするときだからです

var MyObject = function() {
    var prop = {}; 
    return prop;
}

関数を変数 MyObject に割り当てています。カスタム オブジェクト MyObject を作成していません。カスタム オブジェクトを作成するには、次の構文を使用する必要があります。

function MyObject() {
    var prop = {}; 
    return prop;
}

var testObject = new MyObject();
console.log(testObject instanceof MyObject); // return true;

参照: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof

于 2015-08-03T15:24:07.560 に答える