8

このコードを考えてみましょう:

(function(){
    var a = {"id": "1", "name": "mike", "lastname": "ross"};
    var b = JSON.parse('{"id": "1", "name": "mike", "lastname": "ross"}');
    var c = Object.create({"id": "1", "name": "mike", "lastname": "ross"});

    document.write(typeof(a) + "</br>");
    document.write(typeof(b) + "</br>");
    document.write(typeof(c) + "</br>");
})();​

質問

  1. 3つの割り当ての違いはどれですか?
  2. オブジェクトa、b、cは正確に重なっていますか?
  3. はいの場合、なぜですか?いいえの場合、なぜですか?

あなたの答えへの参照を追加してください。

デモ

4

2 に答える 2

7

ab結果は「同一」のオブジェクトになります(abdが同一であるのと同じ方法で{a:1}{a:1}

JSON.parse入力JSON文字列を解析し、解析された値を出力します。この場合、オブジェクト。

c異なります。Object.createプロトタイプを最初の引数に設定して新しいオブジェクトを作成します。c.__proto__.idこれが等しいことを確認できます1(最初の2つのケースでは使用できません)。

一見すると、3つのメソッドすべてが「同じ」オブジェクトになります。プロパティを読み取ると、すべての場合にid得られます。13番目のケースでは、この結果はプロトタイプの継承が原因です。これは可能な機能を提供します:

var x = Object.create({id:1});
x.id = NaN;
console.log(x.id);
// NaN
delete x.id;
console.log(x.id);
// 1 - The old value is back :)
// ( for x = {id: 1};, the old value would be gone! )
于 2012-10-11T14:18:19.407 に答える
7

a実質的bに同一です(同じ場所に同じ値で同じプロパティがあります)。c完全に異なります。限られた情報をページに出力する代わりに、オブジェクトをコンソールに記録すると、明確な違いがわかります。

ここに画像の説明を入力してください

c右の方です。独自のプロパティを持たないオブジェクトが作成されました。指定したプロパティは、実際にはのprototypeにありcます。この理由は、への最初の引数Object.createprototype作成されるオブジェクトのであるためです。

同じ効果を得るのに使用できることに注意してください-最初の引数として渡すだけです:Object.createObject.prototype

var d = Object.create(Object.prototype, { 
    "id": { "value": 1 }, //values are 'property descriptors'
    "name": { "value": "mike" }
    //etc...
});
于 2012-10-11T14:18:35.997 に答える