JavaScript原型链是属性查找的真实路径,由[[Prototype]]隐式链接构成,从对象自身向上遍历至null;__proto__指向构造函数的prototype,后者仅函数拥有,Object.getPrototypeOf()是标准获取方式;class只是语法糖,原型链依然存在且只影响读取。

JavaScript 的原型链不是“继承机制的模拟”,而是对象查找属性时真实发生的路径。它不靠 class 关键字驱动,而由每个对象内部的 [[Prototype]] 隐式链接构成——这个链接指向另一个对象,查找失败时就顺着它继续找,直到为 null 为止。
为什么 obj.toString() 能用,但 obj 上并没有定义它?
因为 toString 在 Object.prototype 上。当你访问一个对象上不存在的属性时,JS 引擎会自动沿着 [[Prototype]] 链向上查找:
- 先查
obj自身是否有toString - 没有 → 查
obj.__proto__(即Object.getPrototypeOf(obj)) - 还没找到 → 继续查它的
__proto__,也就是Object.prototype - 找到了 → 返回该方法
- 如果一直查到
null还没找到,就返回undefined
__proto__、prototype 和 Object.getPrototypeOf() 到底谁对应谁?
三者常被混用,但职责完全不同:
-
__proto__是每个实例对象上的访问器属性(已废弃但广泛支持),指向其构造函数的prototype -
prototype是每个函数对象才有的属性,仅在该函数被用作构造函数时生效,它的值是将来所有实例的[[Prototype]] -
Object.getPrototypeOf(obj)是标准、安全的获取对象原型的方式,应替代obj.__proto__
例如:function Foo() {},那么 new Foo().__proto__ === Foo.prototype,且 Object.getPrototypeOf(new Foo()) === Foo.prototype。
立即学习“Java免费学习笔记(深入)”;
十天学会易语言图解教程用图解的方式对易语言的使用方法和操作技巧作了生动、系统的讲解。需要的朋友们可以下载看看吧!全书分十章,分十天讲完。 第一章是介绍易语言的安装,以及运行后的界面。同时介绍一个非常简单的小程序,以帮助用户入门学习。最后介绍编程的输入方法,以及一些初学者会遇到的常见问题。第二章将接触一些具体的问题,如怎样编写一个1+2等于几的程序,并了解变量的概念,变量的有效范围,数据类型等知识。其后,您将跟着本书,编写一个自己的MP3播放器,认识窗口、按钮、编辑框三个常用组件。以认识命令及事件子程序。第
用 class 写代码,原型链还存在吗?
存在,而且没变。ES6 的 class 只是语法糖,底层仍基于原型链工作:
-
class B extends A实际设置的是B.prototype.__proto__ = A.prototype -
super()调用的是父类构造函数,不改变原型关系 - 静态方法挂在
B函数本身上,而非B.prototype;它们不会出现在实例的原型链中
可以验证:class C {},然后 Object.getPrototypeOf(new C()) === C.prototype,结果为 true。
真正容易被忽略的是:原型链只影响读取(get),不影响赋值(set)。给实例属性赋值时,永远写在实例自身,不会触发原型上的同名属性更新——这也是为什么修改 Array.prototype.push 不会影响已有数组的 push 行为,除非你显式覆盖或重定义它。










