每个函数创建时自动拥有prototype属性,用于存放实例共享的属性和方法;prototype自带constructor指向自身;仅函数有prototype,实例通过__proto__访问;修改prototype会实时影响所有实例。

每个函数在 JavaScript 中创建时,都会自动拥有一个 prototype 属性,它是一个对象,专门用来存放该函数作为构造函数时,其所有实例**共享的属性和方法**。
prototype 是函数的“共享仓库”
这个属性不是给函数自己用的,而是为将来用 new 调用它所创建的实例服务的。比如:
function Dog(name) {
this.name = name; // 实例独有
}
Dog.prototype.bark = function() {
console.log('Woof!'); // 所有 Dog 实例共用一份
};
这时,Dog.prototype 就像一个公共储物柜——bark 方法只存一份,但 new Dog('Leo') 和 new Dog('Maya') 都能调用它,不用各自复制一遍。
prototype 对象自带 constructor 属性
新生成的 Dog.prototype 对象会自动带一个 constructor 属性,指向 Dog 函数本身:
-
Dog.prototype.constructor === Dog→true - 这个回指关系让实例能知道“我是谁造出来的”,也方便后期扩展或识别类型
prototype 只属于函数,不属于普通对象
注意区分两个概念:
-
function A(){}→A.prototype存在(是对象) -
const a = new A()→a.prototype是undefined(实例没有 prototype 属性) - 但
a.__proto__存在,且等于A.prototype;这是实例通往共享内容的隐式通道
修改 prototype 会影响已有实例
因为实例通过 __proto__ 链接的是同一个原型对象,所以动态添加或改写 prototype 上的内容,所有已存在的实例立刻可见:
const d1 = new Dog('Max');
Dog.prototype.run = function() { console.log('Running!'); };
d1.run(); // ✅ 正常输出,即使 d1 创建于 run 定义之前
这种“实时生效”的特性,是原型机制灵活又容易被忽略的关键点。











