前端面试-基础-JS(1)- 原型链

107 阅读1分钟

面试系列原地址 gitee.com/gusiil/fein…,持续更新中

原型链

属性

  • prototype

    prototype 只有函数存在,实例对象是不存在 prototype 的
    prototype 念做原型对象

  • __proto__

    _proto_只是个指针,永远指向某个对象的 prototype
    所有对象都存在proto, Object.prototype.__proto__指向 null,原型链的终点

  • constructor

    每个实例对象都有 constructor,指向他的构造函数
    constructor 读作构造函数
    需要注意 constructor 只存在 prototype 上,实例上能访问本质是继承的 constructor

简单概念

  1. 当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。

  2. 看代码

    function Person() {
    
     }
    
     var person = new Person();
    
     person.__proto__ == Person.prototype // true
     Person.prototype.constructor == Person // true
    
     // 顺便学习一个ES5的方法,可以获得对象的原型
     Object.getPrototypeOf(person) === Person.prototype // true
    
  3. Person.prototype.constructor === Person === person.constructor

开始套娃

看代码

Function.prototype.__proto__ === Object.prototype // true

// 以下都是true
Function.__proto__ === Function.prototype
Object.__proto__ ===  Function.prototype
Number.__proto__ === Function.prototype
Date.__proto__ === Function.prototype


// 这两个是true
Math.__proto__ === Object.prototype
JSON.__proto__ === Object.prototype

如何理解这些内置属性的原型链呢?其实就是两个规律

  1. 本身是函数,可以 new 出对象的。本质都是 Function 的实例,Function 内置对象本身套娃,因此写死了 Function.constructor === Function
  2. Math,JSON 本身是对象,没啥好说的