原型属性与静态属性职责不同:静态属性属构造函数本身,用于类级配置或计数;原型属性属prototype,为实例提供共享行为。前者不继承,后者可被子类继承并重写。

原型属性和静态属性在类模拟中承担完全不同的职责,识别它们的关键在于看“谁拥有它”和“谁需要它”。
看归属对象:构造函数本身 vs 构造函数的 prototype
静态属性直接挂在构造函数上,比如 Person.count = 0;原型属性则挂在 Person.prototype 上,比如 Person.prototype.sayHello = function() {...}。访问时前者用 Person.count,后者既可用 person.sayHello(),也可用 Person.prototype.sayHello()。
看共享逻辑:全局唯一 vs 实例间共用
静态属性属于类本身,所有实例共享同一份值,适合计数器、配置项、工具常量等跨实例场景。
原型属性虽也“共享”,但它是为所有实例提供统一行为或默认数据的通道,比如方法定义、通用 getter、可被覆盖的默认字段。
- 静态属性修改会影响整个类(如 API.timeoutMs = 5000)
- 原型属性修改会即时反映在所有已有和未来实例上(如给 Array.prototype.last = function(){...})
看调用意图:类级操作 vs 实例能力扩展
静态属性/方法处理的是“类怎么建、怎么配、怎么统管”的问题,不依赖具体对象;
原型属性/方法解决的是“每个实例都应该能做什么”的问题,天然与 this 绑定,面向实例行为设计。
- 用静态属性管理创建总数:User.totalCreated++
- 用原型属性提供通用行为:User.prototype.isActive = function(){ return this.status === 'active'; }
看继承表现:不可继承 vs 可被子类原型链承接
静态属性不会自动出现在子类上,必须显式复制或通过 Object.setPrototypeOf(Child, Parent) 手动链接;
原型属性天然存在于原型链中,子类实例可直接使用父类原型上的方法,且支持重写。
不复杂但容易忽略

















