原型链是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 到底谁指向谁?
这是最容易绕晕的地方:两者名字像,但作用对象和时机完全不同。
立即学习“Java免费学习笔记(深入)”;
-
Function.prototype是函数对象自带的属性,指向该函数作为构造器时,其实例将共用的那个原型对象 -
obj.__proto__是普通对象的内部属性(已不推荐直接访问),它的值等于创建obj的构造函数的prototype - 比如
const arr = [],那么arr.__proto__ === Array.prototype,而Array.prototype.__proto__ === Object.prototype
别试图“改 __proto__ 来改变继承”,现代代码应统一用 Object.setPrototypeOf() 或 class 语法,否则容易破坏 V8 的内联缓存优化。
思乐微信商城微分销系统是以.net+access/mssql进行开发的微信分销系统。基于微信朋友圈的传播,是打造以分销商为中心的全新微信分销体验。让粉丝实时有效的获取朋友圈流量并快速分享购买分佣。因为是基于微信,所以要在微信上体验才更好。关注我们的微信核心功能:1、自动提示用户关注微信,解决一般程序无关注微信公众号的过程2、只要通过链接进一次,不过好久注册,什么方面注册,只要是用微信注册的,都会算
为什么 hasOwnProperty 不在自己身上却能用?
因为 obj.hasOwnProperty('x') 是从原型链上借来的——obj.__proto__ 是 Object.prototype,而 hasOwnProperty 就定义在那上面。
- 你可以用
obj.hasOwnProperty.call(someObj, 'x')避免被子类重写覆盖 - 但更安全的做法是用
Object.hasOwn(obj, 'x')(ES2022 新增),它不走原型链,直接查自身属性 - 注意:
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 实例后找不到预期方法。










