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
。以下は手順です
プロトタイプが関数 (コンストラクター) のプロトタイプと同じであるオブジェクトを作成します。これは何var testObject = Object.create(MyObject.prototype);
this
この新しく作成されたオブジェクトに設定して (コンストラクター) 関数を呼び出します。これが何をするかvar result = MyObject.call(testObject);
(最初のパラメーターthis
は MyObject 呼び出しの値です)
関数が null 以外のオブジェクトを返す場合、new ...
式はその値に評価されます。それ以外の場合は、ステップ 1 で作成されたオブジェクトに評価されます。
質問については、最後のステップの null 以外の戻り値 (prop = {}) が、ステップ 1 で返されたオブジェクトの型を実際にテストする際に邪魔になっていました。それをコンポーネント ステップに分割することで、作成されたオブジェクトを取得できます (およびinstanceOf テストでそれを使用します)