以下是个人总结
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版)
网友评论