我在对象和适当的单元测试上创建了一个只读属性。
//works as expected
function OnSelf() {
this._val = 'test';
Object.defineProperty(this, 'test', {
enumerable: true,
configurable: false,
get: function () {
return this._val;
}
});
}
但是,我意识到我应该将只读属性放在原型上,而不是每个单独的实例上。我更改了我的代码,然后我的一个测试失败了。
//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 上确认了相同的行为。
这是正确的事情吗?为什么如果属性在对象上,会抛出异常,但在原型上,没有异常?这让我很惊讶。谁能解释为什么会这样?