知识卡片

反射需防原型

普通读书笔记卡 · 1491.a.1

内容

用 typeof 或 for in 枚举属性时,原型链成员(如 toString)也会被看到;只有确认属性属于对象自身才适合当数据处理。判断自有属性应优先用 Object.hasOwn(obj, key),不查原型链,不受对象重写 hasOwnProperty 影响;仅兼容旧环境时退回 hasOwnProperty.call。发散:序列化、权限判断、配置合并都应防止原型属性被误当自有数据。

参考来源

- 位置:《JavaScript语言精粹(修订版)》第3章《对象 Objects》"反射"与"枚举"两节 - 结论依据:原文说明 typeof 会对原型链中的属性(如 toString、constructor)同样产生值,并给出 hasOwnProperty 方法"不会检查原型链"的用法;据此推出反射/枚举必须显式过滤原型属性,现代写法应优先用不依赖实例方法查找的 Object.hasOwn。 - 原始内容:请注意原型链中的任何属性都会产生值:typeof flight.toString // 'function'……另一个方法是使用hasOwnProperty方法,如果对象拥有独有的属性,它将返回true。hasOwnProperty方法不会检查原型链。