Nightly で __proto__ の挙動が変わった

以前、__proto__プロパティの不思議というものを書いたが、Firefox Nightlyで、この __proto__ プロパティに変更が入った。

Firefoxでは元々、Object.prototypeのプロパティに __proto__ があり、それは変わっていないが、Descriptor が変わっている。

Nightly以外

Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
/*
{
  confiburable: false,
  enumerable: false,
  value: null,
  writable: true
}
*/

Nightly

Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
/*
{
  confiburable: true,
  enumerable: false,
  get: function () {
    [native code]
  },
  set: function () {
    [native code]
  }
}
*/

とまあ、DataDescriptor から AccessorDescriptor に変更されている。

さらに、面白いことに、configurable が true に変わっている。何を意味するか。これは、delete できるということである。

delete できると?

"__proto__"という名前のプロパティを簡単に作成できるようになる。簡単になるというだけで、definePropertyを使えば今までもできたけどね。

JSON.stringify({ __proto__: "HGOE" }); // '{}'

delete Object.prototype.__proto__;
JSON.stringify({ __proto__: "HOGE" }); // '{"__proto__":"HOGE"}'

var obj = {};
obj.__proto__ = 5;
obj.__proto__; // 5