7

この質問について、私は何かを解決するための解決策を期待していませんが、物事をよりよく理解したい..

仕様からの引用:

  • エディション 5.1 (リンク)

    §15.2.3.5 Object.create ( O [, プロパティ] )

    create 関数は、指定されたプロトタイプで新しいオブジェクトを作成します。create 関数が呼び出されると、次の手順が実行されます。

    1. Type(O) が Object または Null でない場合、TypeError 例外がスローされます。
    2. obj を式 new Object() によるかのように新しいオブジェクトを作成した結果とします。ここで、Object はその名前の標準の組み込みコンストラクターです。
    3. obj の [[Prototype]] 内部プロパティを O に設定します。
    4. 引数 Properties が存在し、未定義でない場合、引数 obj および Properties を指定して標準の組み込み関数 Object.defineProperties を呼び出すかのように、独自のプロパティを obj に追加します。
    5. obj を返します。
  • 第 6 版 - ドラフト (リンク)

    §19.1.3.2 Object.create ( O [, プロパティ] )

    create 関数は、指定されたプロトタイプで新しいオブジェクトを作成します。create 関数が呼び出されると、次の手順が実行されます。

    1. Type(O) が Object または Null でない場合、TypeError 例外がスローされます。
      1. obj を、引数 O を指定した抽象操作 ObjectCreate の結果とします。
      2. 引数 Properties が存在し、未定義でない場合、 a. 抽象操作 ObjectDefineProperties(obj, Properties) の結果を返します。
      3. obj を返します。

私の理解が正しければ、両方の仕様で次のコードを実行できます。

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でテストしたように、(用語が下手で申し訳ありません..) から派生したタイプのオブジェクトを作成したようで、呼び出し不可です:Functionx

x(); // x is not a function 

Oコンストラクターの使用を禁止したり、有効なコンストラクターを作成したりしない理由を考えています。

では、Object.create がコンストラクターで何をすることを期待しているのでしょうか?

4

2 に答える 2

2

では、Object.create がコンストラクターで何をすることを期待しているのでしょうか?

もちろん、仕様に従うことを期待しています…</p>

コンストラクターをOとして使用することを禁止しない理由を考えています

なぜそれが必要なのですか?すべてのコンストラクター関数はオブジェクトです (§8.6)

... または、有効なコンストラクターを作成するだけです。

仕様ではnew Object、[[prototype]] が O に設定されたプレーン オブジェクト ( のように) を作成する必要があると述べています。プレーン オブジェクトは関数ではなく、[[call]] または [[construct]] プロパティを持ちません。またObject、 ではなく[[class]] を持ちFunctionます。

x.prototype.constructor===F // true
x instanceof Function // true
typeof x // 'object'

タイプが派生するオブジェクトを作成したようです(用語が下手で申し訳ありません..) 関数

からF、実際には。それは.prototypeからプロパティを継承します(それFがあなたの最初のテストが である理由ですtrue)。それでも、[[call]] プロパティがない (callable ではない) ため、yieldではなく、.FFunction.prototypeinstanceof Functiontypeof"function""object"

于 2013-10-05T19:56:08.123 に答える