Skip to content

原型

每一个构造函数 prototype 属性,它的属性值是一个对象,即原型,这个对象包含了可以由该构造函数的所有实例共享的属性和方法;每一个实例内部 __proto__ 属性,它指向构造函数 prototype 属性。

js
function Instance() {}
const instance = new Instance()
instance.__proto__ === Instance.prototype // true

原型链

每一个实例内部 __proto__ 属性,它指向构造函数 prototype 属性,如此一直往上,直到 Object.prototype.__proto__ ,构成了原型链,而 Object.prototype.__proto__ 值为 null,所以原型链的尽头是 null

js
console.log(Object.prototype.__proto__) // null

应该场景

  • 原型共享,利用实例都共享原型上的属性或方法这一特性,可以将我们自定义的方法挂着在原型上,并通过 this 来访问当前实例;
js
function Person(name) {
  this.name = name
}
Person.prototype.showName = function () {
  console.log(this.name)
}

const p1 = new Person('张三')
const p2 = new Person('李四')
p1.showName() // 张三
p2.showName() // 李四
  • 继承,属性或方法在当前实例上不存在,则会沿着原型链一级一级找,直到找到为止或报错;
js
function Parent() {}
Parent.prototype.say = function () {
  console.log(this.name)
}

function Children(name) {
  Person.call(this)
  this.name = name
}
Children.prototype.__proto__ = Parent.prototype

const p = new Children('孩子')
p.say()
p.showName()

注:原型继承方式多种多样,但其原理都是构造一条原型链,使其需要继承的原型出现在原型链上 Children.prototype.__proto__ = Parent.prototype;借用构造函数可继承父类属性 Person.call(this)