delete 无法删除对象原型链上的属性,仅对自身可配置属性有效;原型属性属于继承而来,delete 操作静默返回 false,需直接修改原型对象或重写方法来改变行为。

不能通过 delete 操作符删除对象的原型属性(即定义在原型链上的属性),因为 delete 只能删除对象自身的可配置属性,对继承来的属性无效。
delete 只作用于自身属性
delete obj.prop 仅当 prop 是 obj 自身的、且 configurable: true 的属性时才成功。原型上的属性不属于该对象自身,因此 delete 不会产生任何效果,也不会报错,只是静默返回 false。
- 例如:
Array.prototype.push是定义在Array.prototype上的,对任意数组实例调用delete arr.push返回false,且arr.push依然可用 - 可通过
Object.hasOwn(arr, 'push')(或旧写法arr.hasOwnProperty('push'))验证它不是自身属性
想“移除”原型方法?改原型本身
如果目标是让所有实例不再拥有某个原型方法,必须直接操作原型对象(如 Array.prototype),而不是实例:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
delete Array.prototype.push—— 这会真正删除该方法(但不推荐,影响全局行为) - 更安全的做法是重写:
Array.prototype.push = function() { throw new Error('push disabled') } - 注意:部分内置原型属性(如
Object.prototype.toString)是不可配置的,delete会失败并静默忽略(严格模式下抛错)
如何判断一个属性能否被 delete
检查属性是否为自身属性且可配置:
Object.getOwnPropertyDescriptor(obj, 'prop')?.configurable === true- 或用
Object.hasOwn(obj, 'prop') && Object.getOwnPropertyDescriptor(obj, 'prop').configurable - 若返回
false,说明要么不是自身属性(可能是原型继承),要么是不可配置的——这两种情况delete都无效
常见误解与替代方案
误以为 delete obj.__proto__.method 能删掉原型方法,其实 __proto__ 是访问器属性,delete obj.__proto__ 也无效(它不可配置)。正确做法是:
- 修改构造函数的
prototype对象(如MyClass.prototype.method = undefined) - 用
Object.defineProperty将原型属性设为configurable: false,防止后续被删 - 设计时优先使用组合而非继承,避免依赖原型修改
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










