静态属性挂载在构造函数上,通过构造函数名访问,所有实例共享;实例属性挂载在this上,每个实例独立拥有。class中用static声明静态成员,实例属性在constructor内或类体顶层定义。

构造函数中区分静态属性和实例属性,关键看属性挂载的位置和访问方式:静态属性属于构造函数本身,实例属性属于每个 new 出来的对象。
静态属性:直接挂在构造函数上
静态属性通过 构造函数名.属性名 定义和访问,不依赖实例。它对所有实例共享,内存中只有一份。
- 定义方式:
Person.species = 'Homo sapiens'; - 访问方式:
Person.species✅,person1.species❌(undefined) - 常见用途:类的元信息(如版本、作者)、工具方法、全局配置
实例属性:挂载在 this 上
实例属性在构造函数内部用 this.属性名 声明,每个实例拥有独立副本。
- 定义方式:
this.name = name;(在 function Person(name) { ... } 内) - 访问方式:
person1.name✅,Person.name❌(undefined) - 注意:即使两个实例同名属性值相同,它们在内存中是分离的
class 语法中的写法差异
ES6 class 更清晰地体现了这种区分:
立即学习“Java免费学习笔记(深入)”;
- 实例属性:写在 constructor 里或类体顶层(
name = 'jack';) - 静态属性:加 static 关键字(
static count = 0;) - 静态方法同样用 static,调用时无需实例:
MyClass.doSomething()
容易混淆的点
不要把原型上的属性误认为静态属性。例如 Person.prototype.sayHi = function(){} 是给所有实例共享的方法,但它不是静态成员——它不能用 Person.sayHi() 调用,只能通过实例调用。
静态成员只认构造函数自身,不走原型链;实例成员必须经由实例,且优先查找自身属性,再沿 prototype 向上找。


















