Object.getPrototypeOf(obj) と obj.__proto__ の違いを教えてください

前提

指定されたオブジェクトのプロトタイプ (つまり、内部プロパティ [[Prototype]] の値) を返します。
Object.getPrototypeOf() - JavaScript | MDN

アクセスされるオブジェクトの内部の [[Prototype]] (オブジェクトまたは null のどちらか) を暴露します。
Object.prototype.__proto__ - JavaScript | MDN

とMDNにあるため、同じものを返すのだろうと思っていましたが、これらが違うものを返すケースがありました。

発生している問題・エラーメッセージ

Object.setPrototypeOfを使ったりobj.__proto__.__proto__に代入するなどして、[[Prototype]][[Prototype]]nullに変更する(削除する?)と、Object.getPrototypeOf(obj)obj.__proto__が一致しません。
(おそらく、下記コードを見ていただいた方が早いです)

これについて、両者の違いを教えてください。

該当のソースコード

js

1{2 class Grandma {3 4 }5 6 class Mama extends Grandma {7 8 }9 10 const child = new Mama();11 12 console.log(child.__proto__ === Object.getPrototypeOf(child)) // true13 console.log(child.__proto__.__proto__ === Object.getPrototypeOf(Object.getPrototypeOf(child))) // true14 15 Object.setPrototypeOf(Object.getPrototypeOf(child), null) // null の場合は、__proto__ と Object.getPrototypeOf() が一致しない。16 // child.__proto__.__proto__ = null // 同上17 18 console.log(child.__proto__) // undefined19 console.log(Object.getPrototypeOf(child) === Mama.prototype) // true20 console.log(child.__proto__ === Object.getPrototypeOf(child)) // false21}22 23{24 class Grandma {25 26 }27 28 class Mama extends Grandma {29 30 }31 32 const child = new Mama();33 34 console.log(child.__proto__ === Object.getPrototypeOf(child)) // true35 console.log(child.__proto__.__proto__ === Object.getPrototypeOf(Object.getPrototypeOf(child))) // true36 37 Object.setPrototypeOf(Object.getPrototypeOf(child), {}) // 空のオブジェクトなどの場合は、__proto__ と Object.getPrototypeOf() が一致する。38 // child.__proto__.__proto__ = {} // 同上39 40 console.log(child.__proto__) // === Mama.prototype41 console.log(Object.getPrototypeOf(child) === Mama.prototype) // true42 console.log(child.__proto__ === Object.getPrototypeOf(child)) // true43}

補足情報(FW/ツールのバージョンなど)

Object.prototype.__proto__が非推奨であることは理解していますので、「そもそもObject.prototype.__proto__を使っているのが間違い」という回答は、当方が望んでいるものではありませんのでご理解ください。

コメントを投稿

0 コメント