この質問について、私は何かを解決するための解決策を期待していませんが、物事をよりよく理解したい..
仕様からの引用:
エディション 5.1 (リンク)
§15.2.3.5 Object.create ( O [, プロパティ] )
create 関数は、指定されたプロトタイプで新しいオブジェクトを作成します。create 関数が呼び出されると、次の手順が実行されます。
- Type(O) が Object または Null でない場合、TypeError 例外がスローされます。
- obj を式 new Object() によるかのように新しいオブジェクトを作成した結果とします。ここで、Object はその名前の標準の組み込みコンストラクターです。
- obj の [[Prototype]] 内部プロパティを O に設定します。
- 引数 Properties が存在し、未定義でない場合、引数 obj および Properties を指定して標準の組み込み関数 Object.defineProperties を呼び出すかのように、独自のプロパティを obj に追加します。
- obj を返します。
第 6 版 - ドラフト (リンク)
§19.1.3.2 Object.create ( O [, プロパティ] )
create 関数は、指定されたプロトタイプで新しいオブジェクトを作成します。create 関数が呼び出されると、次の手順が実行されます。
- Type(O) が Object または Null でない場合、TypeError 例外がスローされます。
- obj を、引数 O を指定した抽象操作 ObjectCreate の結果とします。
- 引数 Properties が存在し、未定義でない場合、 a. 抽象操作 ObjectDefineProperties(obj, Properties) の結果を返します。
- obj を返します。
- Type(O) が Object または Null でない場合、TypeError 例外がスローされます。
私の理解が正しければ、両方の仕様で次のコードを実行できます。
function F() {
}
var x=Object.create(F);
// a minimal test
alert(x.prototype.constructor===F); // true
alert(x instanceof Function) // true
alert(typeof x) // 'object'
私がFireFoxでテストしたように、(用語が下手で申し訳ありません..) から派生したタイプのオブジェクトを作成したようで、呼び出し不可です:Function
x
x(); // x is not a function
O
コンストラクターの使用を禁止したり、有効なコンストラクターを作成したりしない理由を考えています。
では、Object.create がコンストラクターで何をすることを期待しているのでしょうか?