Javascript 尝试删除不允许的属性时引发错误

Javascript 尝试删除不允许的属性时引发错误,javascript,Javascript,因此,我知道可以通过将对象上的configurable属性设置为false来防止删除属性。但是,从这个删除操作中得到的唯一反馈是一个布尔值,它显示true或false。当删除不允许的属性时,是否有任何方法可以立即抛出错误 const obj={ 删除我:“一些文本”, dontDeleteMe:“其他文本” }; Object.defineProperty(obj,'dontDeleteMe'{ 值:“一些文本”, 可写:对, 可枚举:正确, 可配置:false }); console.log

因此,我知道可以通过将对象上的
configurable
属性设置为
false
来防止删除属性。但是,从这个删除操作中得到的唯一反馈是一个布尔值,它显示true或false。当删除不允许的属性时,是否有任何方法可以立即抛出错误

const obj={
删除我:“一些文本”,
dontDeleteMe:“其他文本”
};
Object.defineProperty(obj,'dontDeleteMe'{
值:“一些文本”,
可写:对,
可枚举:正确,
可配置:false
});
console.log(Object.keys(obj));
删除obj.deleteMe;
console.log(Object.keys(obj));
删除obj.dontDeleteMe;

console.log(Object.keys(obj))如果添加
使用strict
,将引发错误:

“严格使用”;
常量对象={
删除我:“一些文本”,
dontDeleteMe:“其他文本”
};
Object.defineProperty(obj,'dontDeleteMe'{
值:“一些文本”,
可写:对,
可枚举:正确,
可配置:false
});
console.log(Object.keys(obj));
删除obj.deleteMe;
console.log(Object.keys(obj));
删除obj.dontDeleteMe;

console.log(Object.keys(obj))如果添加
使用strict
,将引发错误:

“严格使用”;
常量对象={
删除我:“一些文本”,
dontDeleteMe:“其他文本”
};
Object.defineProperty(obj,'dontDeleteMe'{
值:“一些文本”,
可写:对,
可枚举:正确,
可配置:false
});
console.log(Object.keys(obj));
删除obj.deleteMe;
console.log(Object.keys(obj));
删除obj.dontDeleteMe;
console.log(Object.keys(obj))您可以使用
“使用严格”Object.defineProperty()
Object.freeze()


有关详细信息,请访问

'use strict';
var obj = Object.freeze({name: 'Elsa', score: 157});
delete obj.score;  // TypeError

'use strict';
var obj = {};
Object.defineProperty(obj, 'foo', {value: 2, configurable: false});
delete obj.foo;  // TypeError

'use strict';
var frozenArray = Object.freeze([0, 1, 2]);
frozenArray.pop();  // TypeError
使用您的代码:

“严格使用”;
常量对象={
删除我:“一些文本”,
dontDeleteMe:“其他文本”
};
Object.defineProperty(obj,'dontDeleteMe'{
值:“一些文本”,
可写:对,
可枚举:正确,
可配置:false
});
console.log(Object.keys(obj));
删除obj.deleteMe;
console.log(Object.keys(obj));
删除obj.dontDeleteMe;
console.log(Object.keys(obj))您可以使用
“使用严格”Object.defineProperty()
Object.freeze()


有关详细信息,请访问

'use strict';
var obj = Object.freeze({name: 'Elsa', score: 157});
delete obj.score;  // TypeError

'use strict';
var obj = {};
Object.defineProperty(obj, 'foo', {value: 2, configurable: false});
delete obj.foo;  // TypeError

'use strict';
var frozenArray = Object.freeze([0, 1, 2]);
frozenArray.pop();  // TypeError
使用您的代码:

“严格使用”;
常量对象={
删除我:“一些文本”,
dontDeleteMe:“其他文本”
};
Object.defineProperty(obj,'dontDeleteMe'{
值:“一些文本”,
可写:对,
可枚举:正确,
可配置:false
});
console.log(Object.keys(obj));
删除obj.deleteMe;
console.log(Object.keys(obj));
删除obj.dontDeleteMe;
console.log(Object.keys(obj))如果您不想使用“严格使用”(无论出于何种原因),这将是代理解决方案:

const obj={
删除我:“一些文本”,
dontDeleteMe:“其他文本”
};
常量deleteHandler={
deleteProperty(目标、道具){
如果(目标中的道具){
const deleted=删除目标[prop];
如果(!已删除){
错误(`不允许删除:${prop}`);
}
}
}
};
Object.defineProperty(obj,'dontDeleteMe'{
值:“一些文本”,
可写:对,
可枚举:正确,
可配置:false
});
const proxyObj=新代理(obj,deleteHandler);
console.log(Object.keys(proxyObj));
删除proxyObj.deleteMe;
console.log(Object.keys(proxyObj));
删除proxyObj.dontDeleteMe;
console.log(Object.keys(proxyObj))如果您不想使用“严格使用”(无论出于何种原因),这将是代理解决方案:

const obj={
删除我:“一些文本”,
dontDeleteMe:“其他文本”
};
常量deleteHandler={
deleteProperty(目标、道具){
如果(目标中的道具){
const deleted=删除目标[prop];
如果(!已删除){
错误(`不允许删除:${prop}`);
}
}
}
};
Object.defineProperty(obj,'dontDeleteMe'{
值:“一些文本”,
可写:对,
可枚举:正确,
可配置:false
});
const proxyObj=新代理(obj,deleteHandler);
console.log(Object.keys(proxyObj));
删除proxyObj.deleteMe;
console.log(Object.keys(proxyObj));
删除proxyObj.dontDeleteMe;

console.log(Object.keys(proxyObj))向对象添加代理可能会有帮助:?向对象添加代理可能会有帮助:?我不希望冻结对象,它应该仍然是可编辑的。我只想阻止删除某些属性,并在尝试时抛出一个错误。你的“使用严格”建议很好,但是如果可能的话,我想要一个不需要严格模式的解决方案。我不希望冻结对象,它仍然应该是可编辑的。我只想阻止删除某些属性,并在尝试时抛出一个错误。你的“使用严格”建议很好,但是如果可能的话,我想要一个不需要严格模式的解决方案。当考虑使用代理时,我不能只使用
prop!='是否在deletehandler中dontDeleteMe
以禁止删除,而不是将configurable设置为false?或者这种方法有优势吗?它们都是正确的,你可以使用
prop!='dontDeleteMe
或set configurable并在处理程序中进行动态测试,就像我所做的那样,设置configurable的优点是避免通过执行
delete obj来删除属性。dontDeleteMe
intead of
delete proxyObj。dontDeleteMe
在使用代理时,我不能只使用
prop!='是否在deletehandler中dontDeleteMe
以禁止删除,而不是将configurable设置为false?或者这种方法有优势吗?它们都是正确的,你可以使用
prop!='dontDeleteMe
或set configurable并在处理程序中进行动态测试,就像我所做的那样,设置configurable的好处是避免通过执行
delete obj来继续删除属性