实例的 proto 自动指向其构造函数的 prototype 对象。new 调用时引擎隐式设置该连接;仅具 prototype 的函数(如普通函数、class constructor)可作为构造器;箭头函数无 prototype,不可 new;手动改 proto 不推荐,应优先在创建时确定原型关系。

实例的 __proto__ 自动指向其构造函数的 prototype 对象,这是 JavaScript 原型链机制的核心规则。
构造函数创建实例时自动建立连接
当你用 new 调用一个函数时,JavaScript 引擎会创建一个新对象,并把该对象的 __proto__ 内部属性设置为该函数的 prototype 属性值。
- 这个过程是隐式发生的,不需要手动赋值
-
__proto__是实例的内部原型引用,prototype是函数对象上用于共享方法的属性 - 例如:
const obj = new Array();→obj.__proto__ === Array.prototype为true
箭头函数和普通函数的区别
只有具有 prototype 属性的函数(即“可构造函数”)才能作为构造器使用,从而让实例的 __proto__ 指向它。
- 普通函数(
function Foo(){})默认有prototype属性,可被new调用 - 箭头函数没有
prototype属性,不能用new,因此不会产生这种__proto__关联 - 类(
class)本质是语法糖,其 constructor 也是普通函数,同样遵循该规则
手动修改 __proto__ 不推荐
虽然可通过 obj.__proto__ = otherObj 或 Object.setPrototypeOf(obj, otherObj) 改变原型,但会影响性能且破坏引擎优化。
- 应优先在创建时确定原型关系,比如通过
new、Object.create()或class定义 -
Object.create(proto)创建的对象,其__proto__直接等于传入的proto - 避免在运行时频繁变更
__proto__,现代代码中几乎不需要这么做
ES6 的 Symbol.hasInstance 不影响 __proto__
__proto__ 的指向只由构造方式决定,与类型检查逻辑无关。
-
Array.isArray()或instanceof的行为依赖于原型链查找,但不改变__proto__本身 - 重写
[Symbol.hasInstance]只影响instanceof判断结果,不影响实际原型链接 -
__proto__是底层链路,instanceof是基于它的上层协议
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











