构造函数、实例与原型通过prototype、__proto__和constructor构成闭合三角关系:Person.prototype指向原型对象,p.__proto__等于Person.prototype,Person.prototype.constructor回指Person。

识别构造函数、实例与原型之间的三角关系,关键不是死记属性名,而是看清三者如何通过三个核心连接点彼此指向:一个是构造函数的 prototype,一个是实例的 __proto__,还有一个是原型对象上的 constructor。这三点连起来,就构成一个闭合、可验证的逻辑三角。
看构造函数:找 prototype 指向谁
每个函数(被用作构造函数时)自动拥有 prototype 属性,它是一个对象,专为该构造函数创建的所有实例服务。
-
Person.prototype是一个普通对象,不是函数本身,也不是实例 - 这个对象默认带有一个
constructor属性,值就是Person函数本身 - 你往
Person.prototype上添加方法或属性,所有后续实例都能共享使用
看实例对象:查 __proto__ 是否对得上
每个通过 new Person() 创建的实例(如 p1),内部都有一个隐式链接 __proto__,它不用于编程,但可用于调试和理解原型链。
-
p1.__proto__ === Person.prototype—— 这是三角中最直接的一条边,必须为 true - 实例自己没有
sayHello方法,但它能调用,靠的就是这条链去原型上查找 -
p1.constructor不是实例自己定义的,而是从p1.__proto__.constructor继承来的
看原型对象:确认 constructor 是否回指正确
原型对象(即 Person.prototype)不是孤立存在的,它需要“认祖归宗”——明确自己属于哪个构造函数。
-
Person.prototype.constructor === Person—— 这是另一条关键边,确保原型和构造函数身份一致 - 如果手动重写
Person.prototype = {...},记得补上constructor: Person,否则这条边就断了 - 浏览器控制台里展开一个实例,看到的
constructor就来自这里,不是实例自身拥有的
动手验证:三行代码就能画出三角
打开控制台,执行这几行,结果全为 true,就说明三角关系成立:
const p = new Person("李四");p.__proto__ === Person.prototypePerson.prototype.constructor === Person-
p.constructor === Person(间接成立,依赖前两条)
这四句不是并列关系,而是环环相扣:前两行建立实例 ↔ 原型连接,第二、三行确立原型 ↔ 构造函数连接,最后自然导出实例 ↔ 构造函数的间接关联。

















