创建干净原型结构需分离实例数据与共享行为:属性放实例,方法挂prototype;构造函数初始化自有属性,prototype承载共用方法;避免构造函数内定义函数、污染object.prototype;工厂函数不构建原型链,仅适用于简单对象。

要创建干净的原型结构,核心是把“实例专属数据”和“共享行为”明确分开:属性(尤其是原始值)放在实例上,方法和通用属性统一挂到 prototype 上,避免在构造函数里重复定义函数。工厂函数本身不参与原型链构建,它只是对象生成器;真正支撑原型链的是构造函数 + prototype + 实例的 __proto__ 关联。
构造函数 + prototype 是原型链的基石
只有构造函数才有 prototype 属性,这个属性指向一个对象(即“原型对象”),所有通过 new 创建的实例,其 __proto__ 会自动指向该 prototype。
- 构造函数只负责初始化实例自有属性(如
this.name = name) - 所有实例共用的方法(如
sayHi、run)应一次性添加到Constructor.prototype上 - 不要在构造函数体内写
this.sayHi = function() {...}—— 这会导致每个实例都存一份函数,浪费内存
避免污染 Object.prototype,慎用直接赋值
给 Person.prototype 添加方法是安全的,但切勿修改 Object.prototype(比如 Object.prototype.myMethod = ...)。这会影响全局所有对象,可能破坏第三方库或未来 JS 特性。
- 推荐用
Object.assign(Person.prototype, { sayHi() {}, run() {} })批量挂载,语义清晰 - 若需重写整个 prototype(如用对象字面量替代默认空对象),记得手动修复
constructor:
constructor: Person,
sayHi() { console.log(`Hi, ${this.name}`); }
};
工厂函数 ≠ 原型链工具,别混淆角色
工厂函数(如 createCar())返回普通对象,它没有构造函数,也没有 prototype 链路。它的返回值 __proto__ 直接指向 Object.prototype,无法形成自定义原型链。
- 适合快速生成简单配置对象,不适合需要类型识别、继承或共享方法的场景
- 若你发现用了工厂函数后想加
instanceof判断或复用方法,说明该换构造函数 + 原型了 - 工厂函数内部可调用构造函数(如
return new Car(...)),此时才真正接入原型链
验证结构是否干净:三步检查法
创建实例后,用以下方式快速确认原型结构是否合理:
-
console.log(p1.__proto__ === Person.prototype)→ 应为 true -
console.log(p1.constructor === Person)→ 应为 true(确保 constructor 没被覆盖) -
console.log(p1.sayHi === p2.sayHi)→ 应为 true(证明方法确实共享)











