Skip to content

原型

什么是原型?

原型(Prototype) 是 JavaScript 实现继承和共享属性 的机制。每个对象都有一个 原型对象,对象可以从原型继承属性和方法。

  1. __proto__(隐式原型):JavaScript 每个对象 都有一个 __proto__ 属性(非标准,浏览器环境可访问),它指向 创建该对象的构造函数的 prototype

    js
    const obj = {}
    console.log(obj.__proto__ === Object.prototype) // ✅ true
  2. prototype(显式原型):只有 函数(Function) 才有 prototype 属性。prototype 是构造函数的原型对象,其中定义的属性和方法会被所有实例继承。

    js
    function Person(name) {
      this.name = name
    }
    
    console.log(Person.prototype) // ✅ Person 的 prototype 对象

    prototype 属性是一个对象,默认情况下这个 prototype 对象有一个 constructor 属性,指向这个函数本身。

什么是原型链?

JavaScript 对象的属性查找 遵循 原型链(Prototype Chain)

基本查找规则:

  1. 访问对象属性时,先查找对象本身;
  2. 如果找不到,会沿着 __proto__ 向上查找 原型对象,直到 Object.prototype
  3. 如果 Object.prototype 也找不到,则返回 undefined
js
function Person(name) {
  this.name = name
}
Person.prototype.sayHello = function () {
  console.log('Hello')
}

const p = new Person('Tom')

console.log(p.name) // ✅ Tom(实例自身属性)
console.log(p.sayHello) // ✅ sayHello 方法,来自 `Person.prototype`
console.log(p.toString) // ✅ 来自 `Object.prototype`
console.log(p.__proto__.__proto__ === Object.prototype) // ✅ true
console.log(Object.prototype.__proto__) // ✅ null(原型链终点)

延申

A instanceof B,判断的是?

在 A 的原型链上去找 B 的原型(B.prototype)

...

  • for...in 循环可以遍历对象自身以及其原型链上的可枚举属性。
  • Object.assign(obj1, obj2) 可以实现对象的浅拷贝。
  • Object.keys(obj) 得到的是对象自身的可枚举属性。

基于 MIT 许可发布