Warum ist __proto__ undefiniert?

8

Beim Lesen von Javascript-Prototypen bin ich auf dieses Verhalten gestoßen, das ich nicht erklären kann. Ich teste das in Chroms Konsole (das ist V8).

%Vor%

Bisher ist alles wie erwartet. Aber wenn ich das tue:

%Vor%

dann coke.__proto__ === undefined . Warum ist es undefined im zweiten Fall?

    
Kaarel Purde 17.02.2016, 13:34
quelle

1 Antwort

7

Ich habe einmal ein Problem für dieses Verhalten behoben , aber es wurde als Standard geschlossen -konformes Verhalten. Nach dem engen Grund der Ausgabe:

  

Dies funktioniert wie angegeben. ES6 __proto__ ist ein Getter, der auf Object.prototype definiert ist. Für ein Objekt, das nicht das in seiner Prototypkette hat, ist es nicht zugänglich (genau wie, sagen wir, hat hasOwnProperty nicht). Sie müssen stattdessen Object.getPrototypeOf verwenden.

Das stimmt tatsächlich: ES6 Abschnitt B.2.2. 1 definiert Object.prototype.__proto__ ; Daher wird die Eigenschaft __proto__ von Object.prototype geerbt. Ihr coke -Objekt wurde jedoch mit Object.create(null) erstellt, sodass es in seiner Prototypkette nicht Object.prototype hat.

Ein Objekt besitzt zu seinem Prototyp immer internes Wissen, gespeichert in seinem [[Prototyp]] interner Slot . Die Eigenschaft __proto__ ist eine Möglichkeit, über Code auf diesen intern bekannten Prototyp zuzugreifen. Das Fehlen eines Objekts an einer __proto__ -Eigenschaft wirkt sich nicht auf seinen Slot [[Prototyp]] aus, der immer noch existiert.

Um ganz klar zu sein: coke hat einen Prototyp (gespeichert in [[Prototyp]]), und dieser Prototyp ist das Objekt drink . Sie können dies mit Object.getPrototypeOf(coke) sehen. Dies ist jedoch die gesamte Prototypenkette, da der Prototyp von drink null ist. Daher kann coke __proto__ nicht von Object.prototype.__proto__ erben, da Object.prototype in seiner Prototypkette nicht vorhanden ist.

    
apsillers 17.02.2016, 13:41
quelle

Tags und Links