オブジェクトの読み取り専用プロパティと適切な単体テストを作成しました。
//works as expected
function OnSelf() {
this._val = 'test';
Object.defineProperty(this, 'test', {
enumerable: true,
configurable: false,
get: function () {
return this._val;
}
});
}
しかし、個々のインスタンスではなく、プロトタイプに読み取り専用プロパティを配置する必要があることに気付きました。コードを変更したら、テストの 1 つが失敗しました。
//no exception when trying to delete the property
function OnPrototype() {
this._val = 'test';
}
Object.defineProperty(OnPrototype.prototype, 'test', {
enumerable: true,
configurable: false,
get: function () {
return this._val;
}
});
プロトタイプの読み取り専用プロパティを削除しても例外はスローされませんが、プロパティがオブジェクトにある場合は例外がスローされるようです。
var s = new OnSelf();
delete s.test; // throws error
var p = new OnPrototype();
delete p.test; // doesn't delete it, but no error occurs
問題を示すためにhttp://jsfiddle.net/pdgreen/3BGfM/を作成しました。chrome と firefox の Mac でも同様の動作を確認しました。
これは正しいことですか?プロパティがオブジェクトにある場合、例外がスローされますが、プロトタイプでは例外がスローされないのはなぜですか? これは私を驚かせます。なぜそうなのか、誰か説明できますか?