2012-10-11 11 views
8

Lassen Sie uns diesen Code betrachten:JSON-Literale und Javascript-Objekte. Ich bin verwirrt

(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>"); 
})();​ 

Fragen

  1. , die die Unterschiede zwischen den drei Aufgaben sind?
  2. Überlappen sich die Objekte a, b und c genau?
  3. Wenn ja, warum? Wenn nein, warum?

Bitte fügen Sie Referenzen zu Ihren Antworten hinzu.

Demo.

+0

a, b und c sind verschiedene Objekte mit demselben Schlüssel Wertpaar. a == b wird falsch sein. Sie sind an verschiedenen Orten in Erinnerung. – Anoop

Antwort

7

a und b sind effektiv identisch (sie haben die gleichen Eigenschaften, mit den gleichen Werten, an den gleichen Stellen). c ist völlig anders. Sie können einen deutlichen Unterschied sehen, wenn Sie die Objekte an der Konsole anmelden, anstatt begrenzte Informationen zur Seite zu drucken:

enter image description here

c die auf der rechten Seite ist. Es wurde ein Objekt ohne eigene Eigenschaften erstellt. Die von Ihnen angegebenen Eigenschaften sind tatsächlich auf von c. Der Grund dafür ist, dass das erste Argument zu Object.create das prototype des Objekts ist, das erstellt werden soll.

Beachten Sie, dass konnte Verwendung Object.create den gleichen Effekt zu erzielen - nur Object.prototype als erstes Argument übergeben:

var d = Object.create(Object.prototype, { 
    "id": { "value": 1 }, //values are 'property descriptors' 
    "name": { "value": "mike" } 
    //etc... 
}); 
7

a und b Ergebnis in "indentical" Objekte (in der gleichen Weise, {a:1} abd {a:1} identisch sind).

JSON.parse analysiert den Eingang JSON Zeichenfolge und gibt den analysierten Wert aus. In diesem Fall ein Objekt.

c ist anders. Object.create erstellt ein neues Objekt, dessen Prototyp auf das erste Argument festgelegt ist. Sie können überprüfen, dass c.__proto__.id gleich 1 ist (und in den ersten beiden Fällen nicht verfügbar).

Auf den ersten Blick ergeben alle drei Methoden das "gleiche" Objekt: Das Lesen der Eigenschaft id ergibt in allen Fällen 1. Im dritten Fall wird dieses Ergebnis durch die Vererbung des Prototyps verursacht. Dies bietet eine mögliche Funktion:

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!) 
Verwandte Themen