原型链和原型对象分析

167 阅读1分钟

概念

原型链主要是用来解决对象间的继承问题。原型链是由原型对象组成,每个对象都有 __proto__ 属性,指向了创建该对象的构造函数的原型。__proto__ 将对象连接起来组成了原型链。即原型链是一个用来实现继承和共享属性的有限的对象链。

首先, 假设我们有个函数Person

function Person () {}

解析

  1. 在Javascript中,每个函数都有一个原型属性prototype指向自身的原型。即Person.prototype就是Person函数的原型。
  2. 由这个函数创建的对象也有一个__proto__属性指向这个构造类函数的原型。 即new Person().__proto__ == Person.prototype
  3. 而函数的原型是一个对象,所以这个对象也会有一个__proto__属性链接构造类的原型对象,这样逐层深入直到Object对象的原型,这样就形成了原型链。Person.prototype.__proto__ == Object.prototype
  4. 每个函数都用一个原型属性prototype指向它的原型对象(如1)。但是Function除外,其原型对象是函数对象。
  5. 每个构造函数的__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;
}