プロトタイプチェーンを Object.prototype の先にもつなげる
- カテゴリ:
- JavaScript
- Chrome
- コメント数:
- Comments: 0
◆ Chrome は Object.prototype の先にもチェーンをつなげられます
◆ サイクリックチェーンに注意
◆ そこに Proxy 持ってくるとブラウザクラッシュにつながります
◆ サイクリックチェーンに注意
◆ そこに Proxy 持ってくるとブラウザクラッシュにつながります
通常プロトタイプチェーンは Object.prototype.__proto__ が null になっていてここでおしまいです
伸ばすとどうなるのか気になったので伸ばしてみます
エラーが出ました
内容は ループになってるということ
{} で作ったオブジェクトの __proto__ は Object.prototype です
なのでこんなことになるわけです
ならループしないようにしてみます
何の役にも立たなそうですが一応こんなことができます
普通はすべてのデータで使えるプロパティ(メソッド)が欲しいなら Object.prototype に追加すればいいです
Object.prototype の下に作っても {} などで作ったオブジェクトは Object.prototype にチェーンがつながっていて全部のオブジェクトで使えないので それ自身か上側に追加する必要があります
何かに使えないものかと Object.prototype の先を Proxy オブジェクトにして getter をつけて何か存在しないプロパティへのアクセスをどうにかしてみようとしたのですが Chrome がバグってしまいました
切断されたらしいメッセージがでました
だそうです
Chromium バージョンによっては何も出ないで反応なくなって何もできなくなるのと 上の画像みたいになるのがありました
getter が空だと大丈夫みたいで console.log するだけでアウトなようです
コードは↓ですが真似しないようにしましょう
Proxy の get 使うと絶対プロパティが存在する扱いになってしまうのってどうにかできないのでしょうか
return しなければ undefined が返されてしまいますが 何も返さなかったら普通にどおりの見つからなかった動作で次に行ってくれるとこんな固まることもないと思うんです
ところで Firefox では Object.prototype の先にチェーンをつなげることはできません
Object.prototype.__proto__
// null
// null
伸ばすとどうなるのか気になったので伸ばしてみます
Object.prototype.__proto__ = {a:1}
Uncaught TypeError: Cyclic __proto__ value(…)
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
できましたね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 がバグってしまいました
切断されたらしいメッセージがでました
DevTools was disconnected from the page.
Once page is reloaded, DevTools will automatically reconnect.
だそうです
Chromium バージョンによっては何も出ないで反応なくなって何もできなくなるのと 上の画像みたいになるのがありました
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
p.__proto__ = null
Object.prototype.__proto__ = p
// ここから反応ない
var x = {}
x.a
Proxy の get 使うと絶対プロパティが存在する扱いになってしまうのってどうにかできないのでしょうか
return しなければ undefined が返されてしまいますが 何も返さなかったら普通にどおりの見つからなかった動作で次に行ってくれるとこんな固まることもないと思うんです
ところで Firefox では Object.prototype の先にチェーンをつなげることはできません