删除Node类实例的Symbol属性时触发TypeError错误求助
解决Node类中Symbol属性无法删除的TypeError问题
这个错误的核心原因很明确——你用Object.defineProperty定义symbols.parent属性时,没有显式设置configurable: true,而该选项的默认值是false。当一个属性的configurable为false时,JavaScript会禁止对其执行删除操作,也不允许修改它的属性描述符。
方案1:修改Node类的属性定义(推荐)
直接在定义symbols.parent时添加configurable: true配置项,这样后续就能正常删除该属性了:
export const symbols = { parent: Symbol('@xml.js.parent'), }; export class Node { [key: string]: any; constructor(parent: Node, name: string) { Object.defineProperty(this, symbols.parent, { value: parent, writable: true, enumerable: false, configurable: true // 新增这一行,允许删除或修改属性描述符 }); } }
修改后,执行delete self.currentNode[exports.symbols.parent]就不会再触发TypeError了。
方案2:无法修改原Node类时的替代方案
如果因为某些原因不能修改原Node类的代码,你需要注意:由于原属性的configurable是false,你无法通过重新配置来开启它(这是JavaScript的硬性限制)。此时可以退而求其次,将属性值置为null或undefined,达到类似“清除”父节点引用的效果:
// 清除父节点引用,替代删除操作 self.currentNode[exports.symbols.parent] = null;
补充说明
configurable: true的作用:允许删除属性、修改属性的描述符(比如把writable从true改成false)。- 为什么
delete会失败?因为Object.defineProperty创建的属性默认是不可配置的,这和直接通过赋值添加的属性(默认configurable: true)行为不同。
内容的提问来源于stack exchange,提问作者user7898461
相关产品推荐
相关产品推荐

