解构赋值不能获取原型链上的属性,只读取对象自身可枚举属性;需从原型对象如Object.prototype显式解构才能获取toString等方法。

不能直接用解构赋值获取原型链上的属性。
解构只读对象自身属性,不沿原型链查找
解构赋值是基于对象自身的可枚举属性进行模式匹配的,它不会像 obj.prop 那样自动沿着 [[Prototype]] 向上查找。即使某个属性存在于 Object.prototype 或自定义原型上,解构时也完全无视——它只看当前对象直接拥有的键。
-
const { toString } = {}→ 报错:Cannot destructure property 'toString' of 'undefined'(因为空对象自身没有toString) -
const obj = {}; const { hasOwnProperty } = obj;→ 同样报错,尽管hasOwnProperty在原型上存在 - 只有
obj.hasOwnProperty('toString')这种点访问或in操作符才触发原型链查找
想“安全获取原型方法”,得先显式提取再解构
如果确实需要把原型上的方法赋给变量(比如借用 Object.prototype.toString),必须手动从原型对象中取值,再对那个原型对象做解构:
-
const { toString } = Object.prototype;✅ 直接解构原型对象本身 -
const { hasOwnProperty } = Object.prototype;✅ 同理 - 若不确定原型是否存在,可加空值保护:
const { toString } = Object.getPrototypeOf(obj) ?? {};
常见误用:以为解构能替代点访问
有人尝试这样写:const { toString } = obj; 并期望它等价于 obj.toString。这是错的。前者查 obj 自身是否有 toString 属性;后者会顺着原型链找到 Object.prototype.toString。两者行为完全不同。
立即学习“Java免费学习笔记(深入)”;
- 要保留原型链语义,就别用解构,继续用
obj.toString - 若只需函数引用且确定来源,直接从
Object.prototype或Array.prototype解构更清晰、更安全 - 对自定义构造函数的原型方法,同样处理:
const { greet } = MyConstructor.prototype;
本质上,解构和原型链是两套机制:一个面向数据结构提取,一个面向运行时属性查找。混用容易出错,分开用才稳妥。


















