2015-05-04 9 views
5
var protoRabbit = {size: "small"}; 
var fastRabbit = Object.create(protoRabbit); 
console.log(Object.getPrototypeOf(fastRabbit)); 

Powyższe wydruki Snippet:Dlaczego metoda getPrototypeOf() zwraca nieprawidłowy konstruktor w języku JavaScript?

Object {size: "mały"}

jeżeli nie jest to druk protoRabbit {size: "mały"} zamiast tego? Czego mi brakuje w moim rozumieniu?

+5

Nazwa zmiennej "protoRabbit" nie ma nic wspólnego z samym obiektem. Jest to po prostu zmienna, która zachowuje odniesienie do obiektu. Obiekty nie mają nazw wewnętrznych. – Pointy

+0

Wykonaj 'console.log (protoRabbit)' i wydrukuje to samo. – Bergi

Odpowiedz

6

Nazwa nadrukowana przed obiektem to nazwa funkcji konstruktora. Państwa obiekt protoRabbit ma konstruktora Object, ponieważ stworzenia tego obiektu, za pomocą obiektu dosłowne:

var protoRabbit = {size: "small"}; 

Jeśli chcesz ten przedmiot mieć inny konstruktor, trzeba użyć własnej funkcji konstruktora:

function Constr() { 
    this.size = "small"; 
} 
var protoRabbit = new Constr(); 
var fastRabbit = Object.create(protoRabbit); 
console.log(Object.getPrototypeOf(fastRabbit)); //Constr { size: "small" } 

EDIT

muszę zgodzić się z odpowiedzią Demurgos', że wynik console.log(obj); zależy od implementacji przeglądarek. Może się więc różnić od przeglądarki do przeglądarki i może (podobno) czasem różnić się w obrębie jednej przeglądarki (link).

+0

Uruchomiłem ten fragment w chrome (wersja 42.0.2311.135 (64-bit)) przy użyciu Mac 10.10 i otrzymałem następujące dane wyjściowe. Obiekt {rozmiar: "mały"} – Harish

+0

@Harish To bardzo interesujące. Szczerze mówiąc, nie wiem, co się tutaj dzieje, ponieważ jeśli logujesz protoRabbit, bezpośrednio po jego utworzeniu, wynik jest zgodny z oczekiwaniami. Zmienia się tylko po uruchomieniu 'Object.create'. Otworzyłem [pytanie uzupełniające] (http://jsfiddle.net/L5eahaLf/) dla tego tematu. Myślę też, że muszę raczej zgodzić się z 'Demurgos', że wynik zależy od implementacji i że jest różny w różnych przeglądarkach. – basilikum

1

Nazwa wyświetlana w konsoli nie jest standardowa. Do każdej przeglądarki należy zapewnienie najlepszego kontekstu w konsoli podczas drukowania obiektu. Faktem jest, że obiekty zawierają odpowiednie właściwości i to wszystko, czego naprawdę potrzebujemy.

Powiązane problemy