构造函数通过prototype属性关联原型对象,其实例的__proto__指向该prototype,从而形成原型链;手动修改prototype会影响所有新旧实例,但需显式维护constructor属性。

构造函数通过 prototype 属性关联原型对象,这是 JavaScript 原型链机制的核心设计。
构造函数的 prototype 属性指向其原型对象
每个函数(包括构造函数)默认拥有一个 prototype 属性,它是一个普通对象,用于存放将来被实例共享的方法和属性。这个对象就是该构造函数的“原型对象”。
例如:
function Person(name) {this.name = name;
}
console.log(Person.prototype); // { constructor: Person }
此时 Person.prototype 就是所有 new Person() 实例的原型对象。
立即学习“Java免费学习笔记(深入)”;
实例的 __proto__ 指向构造函数的 prototype
用 new 调用构造函数创建实例时,JavaScript 引擎会自动将该实例的内部属性 [[Prototype]](可通过 __proto__ 访问)设置为构造函数的 prototype 对象。
这意味着:
- person.__proto__ === Person.prototype 为 true
- 当访问 person.sayName 时,若实例自身没有该属性,就会沿 __proto__ 向上查找,即查到 Person.prototype
手动修改 prototype 会影响所有新实例
可以给 Person.prototype 添加方法或属性,这些会立即对后续创建的实例生效:
Person.prototype.sayName = function() {return 'I am ' + this.name;
};
const p1 = new Person('Alice');
console.log(p1.sayName()); // "I am Alice"
注意:已创建的实例也能使用新增方法,因为它们的 __proto__ 仍指向同一个 Person.prototype 对象。
constructor 属性需要手动维护(可选但推荐)
当你直接赋值整个 prototype 对象时(比如 Person.prototype = { ... }),会丢失默认的 constructor 指向。建议显式恢复:
Person.prototype = {constructor: Person,
sayName() { return 'I am ' + this.name; }
};
否则 new Person().__proto__.constructor 会变成 Object,影响类型识别和 instanceof 判断。


















