2012-10-11 9 views
8

Rozważmy ten kod:Literały JSON i obiekty JavaScript. Jestem zdezorientowany

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

Pytania

  1. Jakie są różnice między trzema zadaniami?
  2. Czy obiekty a, b i c dokładnie zachodzą na siebie?
  3. Jeśli tak, dlaczego? Jeśli nie, dlaczego?

Proszę dodać odniesienia do swoich odpowiedzi.

Demo.

+0

a, b i c są różne obiektu z tej samej pary kluczy wartości. a == b będzie fałszywe. znajdują się w różnych miejscach w pamięci. – Anoop

Odpowiedz

7

a i b skutecznie identyczne (mają te same właściwości, z tymi samymi wartościami, w tych samych miejscach). c jest zupełnie inny. Widać wyraźną różnicę, jeśli log obiektów do konsoli zamiast drukowania ograniczone informacje na stronie:

enter image description here

c jest jedną z prawej strony. Tworzy obiekt bez własnych właściwości. Podane właściwości są w rzeczywistości pod adresem prototype z c. Powodem tego jest to, że pierwszym argumentem do Object.create jest prototype obiektu, który ma zostać utworzony.

pamiętać, że mógł użycie Object.create aby uzyskać ten sam efekt - wystarczy przejść Object.prototype jako pierwszy argument:

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

a i b wynik w „identyczne,” obiektów (w taki sam sposób, {a:1} abd {a:1} są identyczne).

JSON.parse analizuje wejście JSON ciąg, i wysyła przeanalizowane wartości. W tym przypadku obiekt.

c jest inny. Object.create tworzy nowy obiekt z prototypem ustawionym na pierwszy argument. Możesz sprawdzić, czy c.__proto__.id jest równy 1 (i niedostępny w pierwszych dwóch przypadkach).

Na pierwszy rzut oka wszystkie trzy metody dają w wyniku "ten sam" obiekt: odczytanie właściwości id daje we wszystkich przypadkach 1. W trzecim przypadku wynik ten wynika z dziedziczenia prototypu. Daje to możliwe funkcję:

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!) 
Powiązane problemy