Appearance
原型
每一个构造函数 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)
。