原型链的理解

原型链

  • 本文将从将从什么是原型链,原型链的主要作用,以及函数和对象之间的关系,继承来说。
什么是原型链?
  • 实例对象和原型对象之间形成的链式结构。
原型的主要作用是什么?
  • 数据共享,实现继承
函数和对象的神秘之处
  • 函数属于对象
   function fn(){
        console.log(123);
     }
     console.log(fn instanceof Object);
+ 上面的代码结果是true。可以证明函数是对象的一种。我们经常又说对象都是函数创建的,在这我来做个解释,这俩句话并不冲突。我们创建对象的时候可以通过构造函数实例化,new Object(),new Array()等方式。
  • 对象是由函数创建出来的
        //var obj = { a: 10, b: 20 };
        //var arr = [5, 'x', true];
    
        var obj = new Object();
        obj.a = 10;
        obj.b = 20;
    
        var arr = new Array();
        arr[0] = 5;
        arr[1] = 'x';
        arr[2] = true;
    
    • 而Object和Array又是函数
console.log(typeof (Object));  // function
console.log(typeof (Array));  // function
+ 既证明了函数是对象,又证明了对象是函数创建出来的,下面来深入理解下原型。 
原型prototype
  1. 所有的函数都是Function的实例对象,在构造函数上都有一个原型属性prototype,该属性也是一个对象,此对象上有construction属性指向原型所属的构造函数,还有__proto__属性。此外,每个实例对象上也都有proto属性,指向构造函数的原型,这个属性只在浏览器内部使用。
  2. 实例对象的__proto__===构造函数的prototype。
  3. obj.proto===Object.prototype ---(特别的)
  4. Function.proto===Function.prototype ---(特别的)
  5. Function是一个函数,函数也是一种对象,也有__proto__属性,函数又都是被Function创建的,即Function是被自身创建的,他的__proto__指向了自身的prototype。
  6. 补充:instanceof(用于判断一个变量是否某个对象的实例).判断规则(A instanceof B),顺着A的__proto__属性这条线找,同时沿着B的prototype的这条线找,如果能找到同一个引用,返回true,即是这个对象的实例。
继承
  • instanceof表示的就是一种继承关系,或者是说原型链的结构,所有的对象的原型链都会找到Object.prototype,所以所有的对象都会有Object.prototype的方法,这就是所谓的继承。
原文地址:https://www.cnblogs.com/lml-lml/p/7096299.html