电话
400 9058 355
原型链是JavaScript对象查找属性时自动遵循的隐式路径:先查自身,再沿__proto__逐级向上直到null;__proto__指向构造函数的prototype;hasOwnProperty等方法来自Object.prototype,推荐用Object.hasOwn()替代。
原型链不是语法结构,而是 JavaScript 对象查找属性时自动遵循的一条隐式路径。理解它不靠背概念,而靠看属性访问时到底发生了什么。
当你写 obj.name,JavaScript 引擎不会只查 obj 自身有没有 name 属性,而是按顺序检查:
obj 自身的属性(Object.hasOwn(obj, 'name') 可确认)obj.__proto__(即 Object.getPrototypeOf(obj))上的 name
obj.__proto__.__proto__,直到为 null 为止这条从实例 → 构造函数原型 → Object.prototype → null 的链条,就是原型链。它全程自动触发,你没调用任何方法,只是读了一个属性。
__proto__ 和 prototype 到底谁指向谁?这是最容易绕晕的地方:两者名字像,但作用对象和时机完全不同。
Function.prototype 是函数对象自带的属性,指向该函数作为构造器时,其实例将共用的那个原型对象obj.__proto__ 是普通对象的内部属性(已不推荐直接访问),它的值等于创建 obj 的构造函数的 prototype
const arr = [],那么 arr.__proto__ === Array.prototype,而 Array.prototype.__proto__ 
=== Object.prototype
别试图“改 __proto__ 来改变继承”,现代代码应统一用 Object.setPrototypeOf() 或 class 语法,否则容易破坏 V8 的内联缓存优化。
hasOwnProperty 不在自己身上却能用?因为 obj.hasOwnProperty('x') 是从原型链上借来的——obj.__proto__ 是 Object.prototype,而 hasOwnProperty 就定义在那上面。
obj.hasOwnProperty.call(someObj, 'x') 避免被子类重写覆盖Object.hasOwn(obj, 'x')(ES2025 新增),它不走原型链,直接查自身属性for...in 会遍历整个原型链上的可枚举属性,而 Object.keys() 只返回自身的原型链让方法复用成为可能,但也意味着修改 Object.prototype 会影响所有对象——这种操作在生产环境等同于埋雷。
class 写法时,原型链还在吗?在。class 只是语法糖,底层仍是基于原型的机制。
class B extends A {} 会自动设置 B.prototype.__proto__ === A.prototype
new B() 的 __proto__ 指向 B.prototype,再往上才是 A.prototype,最后是 Object.prototype
prototype,不能当构造函数;普通函数即使没用 new,也有 prototype 属性(值为 {constructor: fn})真正难调试的,往往不是链本身,而是某处意外覆盖了 constructor 或篡改了 __proto__,导致 instanceof 失效、或 new 实例后找不到预期方法。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...