所有普通对象默认继承Object.prototype上的通用方法,如toString()、hasOwnProperty()等,通过原型链查找机制自动获得;Object.prototype是绝大多数对象原型链终点,提供基础行为,但可被覆盖或切断。
这意味着所有普通对象默认拥有 Object.prototype 上定义的通用方法,比如 toString()、hasOwnProperty()、isPrototypeOf() 等,无需手动添加就能直接调用。
Object.prototype 是绝大多数对象原型链的终点,也是 JavaScript 提供基础行为的“公共池”。只要一个对象没被刻意切断原型链(比如用 Object.create(null) 创建),它就自动能用这些方法:
{a:1}.toString() 返回 "[object Object]"
当你写 obj.toString(),JavaScript 并不会在 obj 自身找这个方法。它按顺序查找:
obj 自身有没有 toString
obj.__proto__(即 Object.prototype)Object.prototype.toString
这个过程就是原型链查找,而 Object.prototype 是这条链上最靠前、最稳定的一环。
立即学习“Java免费学习笔记(深入)”;
用 function Person() {} 创建实例时,new Person() 的 __proto__ 指向 Person.prototype,而 Person.prototype.__proto__ 又指向 Object.prototype。所以即使你没给 Person.prototype 加方法,实例依然能调用 toString() 或 hasOwnProperty()。
虽然继承自 Object.prototype 是默认行为,但你可以主动修改:
Object.create(null) 创建“无原型”对象,它连 toString 都没有,调用会报错toString),会遮蔽 Object.prototype 上的版本Object.prototype.toString 会影响所有对象(不推荐,破坏环境稳定性)