原型与原型链简介

2020-08-24  本文已影响0人  何小蒙

以下是个人总结

1、原型
我们创建的每个函数都有一个prototype(原型)属性,在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。例子:

function Person() {} // 创建一个函数
Person.prototype.constructor = Person // Person就是prototype属性所在函数

当调用构造函数创建一个实例时,该实例的内部就会包含一个指针,指向构造函数的原型对象,例子:

function Person() {} // 创建一个函数
let person1 = new Person()  // 创建一个实例
person1.__proto__ === Person.prototype // true

2、原型链
原型对象 = 另一个类型的实例
因为实例中包含一个指向原型对象的指针,所以如果让一个原型对象等于另一个类型的实例,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。如此层层递进,就构成了实例与原型的链条。这就是所谓原型链的基本概念。例子:

function A () {
    this.a = true
}

A.prototype.getA = function () {return this.a}

function B  ()  {}

B.prototype = new A() // B的原型指向A的实例

let b = new B() // b是B的实例

b.getA() // true

此时,

b. __proto__ = B.prototype
// B.prototype指向了A的实例,所以B的原型对象不是默认的了,也没有默认的 constructor
b. __proto__. __proto__ = A.prototype

这个概念原本是打算在网上看博客的,但是发现很多博客写的并不是很严谨,无赖之下只好自己看JS高程。建议各位如果方便的话,最好直接去看JS高程第六章面向对象的程序设计,比大部分博客好理解,而且知识体系介绍的也比较全面。
本文参考JavaScript高级程序设计(第3版)

上一篇下一篇

猜你喜欢

热点阅读