4

以下のJavaScriptコードスニペットを参照すると、質問があります。

  1. オブジェクトリテラル{item:{value: "foobar"}}が変数に割り当てられた場合(1行目など)とObject.create()に引数として渡された場合(5行目など)で動作が異なるのはなぜですか?

  2. 5行目と8行目の違いは何ですか?つまり、5行目が8行目ではなくObject.create()に2番目の引数を渡す正しい方法であるのはなぜですか(デリゲートのitemプロパティをオーバーライドするため)?

コードスニペット:

 1 var obj = {item: {value: "foobar"}};
 2 console.log(obj.item);            // [object Object]
 3 console.log(obj.item.value);      // foobar

 4 var delegate = {item: "xxx"};
 5 var obj1 = Object.create(delegate, {item: {value: "foobar"}});
 6 console.log(obj1.item);          // foobar
 7 console.log(obj1.item.value);    // undefined

 8 var obj2 = Object.create(delegate, {item: "bar"});
 9 console.log(obj2.item);          // <nothing>
4

2 に答える 2

2

これは、次のリファレンスによると発生します: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create

Object.createkey:value単純なペアではなく、「プロパティ記述子」を持つオブジェクトを 2 番目の引数として受け取ります。

プロパティ記述子の説明については、 http: //ejohn.org/blog/ecmascript-5-objects-and-properties/のブログ投稿を参照してください。

プロパティ記述子は、プロパティ値だけでなく、各プロパティを記述するオブジェクトです。コード スニペットから:

2 obj.item // [object Object] since item is the object {value:"foobar¨}

6 obj1.item // foobar, the descriptor says that the value 
            // of item is "foobar"

7 obj1.item.value // undefined since item="foobar", value is part of
                  // the object that describes "item" not item itself

9 obj2.item  // nothing because the descriptor that you passed 
             // for item is incomplete
于 2012-08-18T03:34:04.187 に答える
0
  1. 1 行目では、オブジェクト リテラルが文字どおりに解釈され、一般的に期待されるようにインスタンス化されます。

    一方、5 行目では、オブジェクト リテラルは文字どおりに解釈されますが、インスタンス化されたオブジェクトが「プロパティ記述子を含むプロパティ オブジェクト」として扱われる Object.create 関数に渡されます。

  2. Object.create 関数は、2 番目のパラメーターが "Properties Object" 規則に従うことを想定しているため、2 番目のパラメーター (8 行目) は無効です (Chrome で型エラーが発生します)。

次のスニペットは、説明に役立つ場合があります。

var PrototypeObj = { item: 'xxx' };

var PropertiesObj = {
  propertyDescriptor1: {
    value: "prop1value",
    writable: true,
    enumerable: true,
    configurable: true
  },
  propertyDescriptor2: {
    value: "prop2value",
    writable: true,
    enumerable: true,
    configurable: true
  }
};

var Obj = Object.create(PrototypeObj, PropertiesObj);

Object.createObject.definePropertyの記事で詳しく説明しています 。

于 2012-08-18T04:13:00.683 に答える