概念
原型链主要是用来解决对象间的继承问题。原型链是由原型对象组成,每个对象都有 __proto__ 属性,指向了创建该对象的构造函数的原型。__proto__ 将对象连接起来组成了原型链。即原型链是一个用来实现继承和共享属性的有限的对象链。
首先, 假设我们有个函数Person
function Person () {}
解析
- 在Javascript中,每个函数都有一个原型属性prototype指向自身的原型。即
Person.prototype
就是Person函数的原型。 - 由这个函数创建的对象也有一个__proto__属性指向这个构造类函数的原型。 即
new Person().__proto__ == Person.prototype
- 而函数的原型是一个对象,所以这个对象也会有一个__proto__属性链接构造类的原型对象,这样逐层深入直到Object对象的原型,这样就形成了原型链。
Person.prototype.__proto__ == Object.prototype
- 每个函数都用一个原型属性prototype指向它的原型对象(如1)。但是Function除外,其原型对象是
函数对象。
- 每个构造函数的__proto__属性指向
Function.prototype
举例:
new Person().__proto__ == Person.prototype //第二点
Person.prototype.__proto__ == Object.prototype //第三点
Person.__proto__ === Function.prototype // 第五点
Object.prototype.__proto_ == null
arr.__proto__ == Array.prototype //第二点
Array.prototype.__proto__ == Object.prototype //第三点
func.__proto__ == Function.prototype //第五点
Function.prototype.__proto__ == Object.prototype //第三点
var A = new Function ();
Function.prototype = A; //第四点
//凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象
instanceOf原理
如何让对象A instanceOf B 为true?
需满足A的原型链上能够找到B的原型对象。
即A能够通过__proto__一直向上找原型对象,直到找到B.prototype,则返回true,否则为false
实现instanceOf
const instanceOf = (A, B) =>{
let p = A;
while(p){
if(p == B.prototype){
return true;
}
p = p.__proto__;
}
return false;
}