「类 vs 实例」对比 ,「类 - 原型 - 实例」的关系

发布于:2025-09-11 ⋅ 阅读:(18) ⋅ 点赞:(0)

坚持的本身就是意义

直观类比

  • 类(Class) = 图纸 / 模板
  • 实例(Instance) = 根据图纸造出来的房子 / 产品

类 (Class) vs 实例 (Instance)

对比表

对比点 类 (Class) 实例 (Instance)
定义方式 使用 class 关键字定义 使用 new 类名(...) 创建
打印结果 打印出来的是 类的结构/定义 打印出来的是 对象(属性 + 值)
内存位置 存在于函数(构造器)区域 存在于堆内存,每次 new 都是新的对象
属性 类本身没有具体属性值,只定义结构 实例对象上有具体的属性和值
方法 方法定义在类的 prototype 实例可以直接调用这些方法
用途 相当于一个“模板” 相当于由模板生产出来的“成品”
例子代码 console.log(Person)
👉 输出:class Person { constructor(...) {...} speak() {...} }
console.log(p1)
👉 输出:Person { name: '张三', age: 22 }

示例代码

class Person {
  name: string
  age: number

  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }

  speak() {
    console.log(`我叫${this.name},今年${this.age}`)
  }
}

console.log(Person) // 类的定义

const p1 = new Person("张三", 22)
console.log(p1)     // 实例对象 Person { name: '张三', age: 22 } 
p1.speak()          // 调用实例方法 我叫张三,今年22岁

类 - 原型 - 实例关系图

   ┌─────────────────────────┐
   │        class Person     │
   │ ─────────────────────── │
   │ constructor(name, age)  │
   │ speak() { ... }         │  ← 方法挂到 prototype 上
   └─────────────┬───────────┘
                 │
                 ▼
        ┌─────────────────┐
        │ Person.prototype│   ← 原型对象
        │ ─────────────── │
        │ speak() { ... } │   ← 共享方法
        │ constructor: f  │
        └───────▲─────────┘
                │ [[Prototype]]
   ┌────────────┴────────────┐
   │                         │
┌──┴───────────┐      ┌──────┴───────────┐
│   p1 实例     │      │    p2 实例       │
│ ───────────  │      │ ───────────      │
│ name: '张三'  │      │ name: '李四'     │
│ age: 22      │      │ age: 18          │
└──────────────┘      └──────────────────┘

解释:

类 (class Person)

  • 定义了构造函数和方法。
  • 方法其实会自动挂载到 Person.prototype 上。

原型 (Person.prototype)

  • 所有实例共享的方法都存在这里。例如 speak() 方法,只存一份,所有实例都能通过原型链访问。

实例 (new Person(…))

  • 每次 new 都会创建一个新的对象(放在堆内存里),对象上存储 独有的数据属性(name, age)。
  • 调用 p1.speak() 时,JS 引擎会:
    • 先找 p1 本身有没有 speak
    • 找不到 → 顺着 proto(即原型链)去 Person.prototype 找
    • 找到后执行
class Person {
  constructor(name, age) {
    this.name = name
    this.age = age
  }
  speak() {
    console.log(`我叫${this.name},今年${this.age}`)
  }
}

const p1 = new Person("张三", 22)

console.log(p1) // Person { name: '张三', age: 22 }
console.log(Person.prototype) // { speak: f, constructor: f }
console.log(p1.__proto__ === Person.prototype) // true

总结:

  • 类 (Class) 是模板,方法都放在 prototype 上。
  • 实例 (Instance) 存放自己的数据属性。
  • 实例通过 proto 链接到 Person.prototype,形成原型链来共享方法。

网站公告

今日签到

点亮在社区的每一天
去签到