◆ Chrome は Object.prototype の先にもチェーンをつなげられます
◆ サイクリックチェーンに注意
◆ そこに Proxy 持ってくるとブラウザクラッシュにつながります

通常プロトタイプチェーンは Object.prototype.__proto__ が null になっていてここでおしまいです
Object.prototype.__proto__
// null

伸ばすとどうなるのか気になったので伸ばしてみます
Object.prototype.__proto__ = {a:1}
Uncaught TypeError: Cyclic __proto__ value(…)

エラーが出ました
内容は ループになってるということ

{} で作ったオブジェクトの __proto__ は Object.prototype です
なのでこんなことになるわけです
Object.prototype --> {a:1} --> Object.prototype

ならループしないようにしてみます
var obj = {a:1}
obj.__proto__ = null
Object.prototype.__proto__ = obj
var val = {}
console.log(val.a)
// 1
できましたね

何の役にも立たなそうですが一応こんなことができます

普通はすべてのデータで使えるプロパティ(メソッド)が欲しいなら Object.prototype に追加すればいいです
Object.prototype の下に作っても {} などで作ったオブジェクトは Object.prototype にチェーンがつながっていて全部のオブジェクトで使えないので それ自身か上側に追加する必要があります


何かに使えないものかと Object.prototype の先を Proxy オブジェクトにして getter をつけて何か存在しないプロパティへのアクセスをどうにかしてみようとしたのですが Chrome がバグってしまいました

proto-proxy-02

切断されたらしいメッセージがでました

DevTools was disconnected from the page.
Once page is reloaded, DevTools will automatically reconnect.

だそうです

Chromium バージョンによっては何も出ないで反応なくなって何もできなくなるのと 上の画像みたいになるのがありました

proto-proxy-01

getter が空だと大丈夫みたいで console.log するだけでアウトなようです

コードは↓ですが真似しないようにしましょう
var p = new Proxy({}, {get:function(a,b){console.log(a,b)}})
p.__proto__ = null
Object.prototype.__proto__ = p
// ここから反応ない
var x = {}
x.a


Proxy の get 使うと絶対プロパティが存在する扱いになってしまうのってどうにかできないのでしょうか
return しなければ undefined が返されてしまいますが 何も返さなかったら普通にどおりの見つからなかった動作で次に行ってくれるとこんな固まることもないと思うんです




ところで Firefox では Object.prototype の先にチェーンをつなげることはできません