in操作符实时响应原型链变更,每次执行都遍历当前原型链:新增/删除原型属性立即影响结果,赋值undefined不改变检测结果,替换原型链后按新链判断。

in 操作符会实时响应原型链的变更,只要属性名出现在对象自身或当前原型链的任意一级上,就返回 true;一旦该属性从整个原型链中被移除(包括删除原型上的定义),结果立即变为 false。
原型上新增属性,in 立即返回 true
无论对象创建多久,只要后续在原型上添加了属性,in 就能立刻检测到:
function Cat() {}const cat = new Cat();-
"meow" in cat → false(初始时原型为空) Cat.prototype.meow = function() {};-
"meow" in cat → true(无需重新实例化,原型链已更新)
原型上删除属性,in 立即返回 false
用 delete 移除原型上的属性后,in 不再命中:
Cat.prototype.sound = "meow";"sound" in cat → truedelete Cat.prototype.sound;-
"sound" in cat → false(即使实例没变,原型链已断开)
注意:赋值为 undefined 不影响 in 结果
只改值不删键,in 依然为 true:
Cat.prototype.legs = 4;"legs" in cat → trueCat.prototype.legs = undefined;-
"legs" in cat → true(键仍存在,只是值是undefined)
原型链被整体替换,in 结果随之重算
如果用 Object.setPrototypeOf() 或直接赋值 __proto__ 更换原型,in 会基于新原型链判断:
const obj = {};-
"toString" in obj → true(来自Object.prototype) Object.setPrototypeOf(obj, null);-
"toString" in obj → false(原型链中断,不再继承任何属性)











