前提
指定されたオブジェクトのプロトタイプ (つまり、内部プロパティ [[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)) // true 13 console.log(child.__proto__.__proto__ === Object.getPrototypeOf(Object.getPrototypeOf(child))) // true 14 15 Object.setPrototypeOf(Object.getPrototypeOf(child), null) // null の場合は、__proto__ と Object.getPrototypeOf() が一致しない。 16 // child.__proto__.__proto__ = null // 同上 17 18 console.log(child.__proto__) // undefined 19 console.log(Object.getPrototypeOf(child) === Mama.prototype) // true 20 console.log(child.__proto__ === Object.getPrototypeOf(child)) // false 21} 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)) // true 35 console.log(child.__proto__.__proto__ === Object.getPrototypeOf(Object.getPrototypeOf(child))) // true 36 37 Object.setPrototypeOf(Object.getPrototypeOf(child), {}) // 空のオブジェクトなどの場合は、__proto__ と Object.getPrototypeOf() が一致する。 38 // child.__proto__.__proto__ = {} // 同上 39 40 console.log(child.__proto__) // === Mama.prototype 41 console.log(Object.getPrototypeOf(child) === Mama.prototype) // true 42 console.log(child.__proto__ === Object.getPrototypeOf(child)) // true 43}
補足情報(FW/ツールのバージョンなど)
Object.prototype.__proto__
が非推奨であることは理解していますので、「そもそもObject.prototype.__proto__
を使っているのが間違い」という回答は、当方が望んでいるものではありませんのでご理解ください。
解決後の追記
解決後に以下のようにしてObject.prototype.__proto__
のゲッターを直接参照して試したところ、動作しましたので、やはりプロトタイプチェーンが切れていることが原因だとわかりました。
js
1Object.getOwnPropertyDescriptor(Object.prototype,'__proto__').get.bind(child)()
回答1件
あなたの回答
tips
プレビュー