zoukankan      html  css  js  c++  java
  • JavaScript原型与原型链深入理解

    原型:
    每一个js 对象(null除外)都会和另一个对象相关联,“另一个”对象就被我们称之为‘原型’,
    而每一个原型拥有一个prototype 属性指向原型对象(就是原型的实例)的引用,
    原型就是通过该prototype将自身的属性和方法共享给继承他的子对象;
    子对象通过__proto__指向原型的prototype进行属性方法继承;这种方式称之为‘原型链’

    原型链

    如图

    1. 其实Function 最特殊(函数界一等公民) 它是它自己的一个实例 ;
      如:
    Function(){}
    let F = new Function();
    Function.prototype = F;
    Function.__proto__ = F;
    

    就是说 Funciton 的原型就是F , 即Function.__proto__ === Function.prototype,
    Function.constructor === Function
    Function.prototype.__proto__ === {} ,没有再指向F而是{}避免了无意义的死循环

    1. 而Object 也是new Function()来的,
      Object.__proto__=F
      Object.__proto__ === Function.prototype

      Object.prototype ==={}
      此处同Function.prototype.__proto__同理最终他的原型对象并没有再指向F; 而是指向了最上层的{} 一个空对象,

    简单分析不难得出 要是他的原型对象和原型都指向同一个那就成死循环了
    即会出现Object.__proto__ = F ; F = new Object();


    1. 而自定义函数默认原型为 F ,即 CustFn.__proto__ === Function.prototype
      以此类推他的构造函数就是Function了 即 CustFn.constructor === Function

    到这里 CustFn 与 其实例的关系也就好理解了,

     let FC = new CustFn();
    CustFn.prototype = FC;
    
    

    而 var custfn = new CustFn(); 就如 custfn = FC;

    所以 custfn.__proto__ === FC
    custfn.__proto__ === CustFn.prototype

    而CustFn.prototype 是 new CustFn();

    来的那么 他的constructor 当然是 CustFn了

    CustFn.prototype 是通过newCustFn() 这个普通函数来的,所以他的原型是一个{}空对象
    CustFn.prototype.__proto__ === {}

    到此不难理解 ‘只有new Function()来的函数 的原型才是Function 其的都是普通对象’,如同 new Object()一样

    个人能力有限,如理解有误的地方还望指点谢谢

  • 相关阅读:
    阿里云高级技术专家周晶:基于融合与协同的边缘云原生体系实践
    Spring Boot Serverless 实战系列“架构篇” 首发 | 光速入门函数计算
    基于 EMR OLAP 的开源实时数仓解决方案之 ClickHouse 事务实现
    【ClickHouse 技术系列】 在 ClickHouse 中处理实时更新
    LeetCode_Two Sum
    LeetCode_ Remove Element
    LeetCode_Same Tree
    LeetCode_Symmetric Tree
    LeetCode_Path Sum
    LeetCode_Merge Sorted Array
  • 原文地址:https://www.cnblogs.com/dengxiaoning/p/12871800.html
Copyright © 2011-2022 走看看