最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 前端八股文-原型链

    正文概述 掘金(风清豆腐)   2021-01-25   924

    写在连载前面的话

    毕业出来工作,做前端也有这么几年了,作为非科班出身,且靠自学半路出家,一直在探索前端如何进阶的问题,个人觉得,最终还是回归于基础。不知道大家是否也和我一样,学了好多东西,最后隔一段时间就又忘了,于是我决定写一套基础的文章,以便有所遗忘,需要的时候可以快速的回忆。也许还能对刚入行的同行,有所帮助。与大家共勉。如果有错误的地方,欢迎在评论区里面指出来。

    一、prototype与__proto__的区别

    • prototype:函数才有的属性(每个函数拥有的一个对象属性,称为原型对象)
    • constractor:对创建此对象的函数的引用(prototype中的constractor指向该构造函数)
    • __proto__:每个对象(包括函数)都有的属性
    注意:大多数情况下,__proto__可以理解为”构造器的原型“,即:
                __proto__ === constractor.prototype
    (通过Object.create()创建的对象不适用此等式) 
    
    /*1、字面量方式*/
    var a = {};
    console.log(a.prototype);  // undefined
    console.log(a.constructor === Object);  // Object
    console.log(a.__proto__ === Object.prototype); // true
    console.log(a.__proto__ === a.constructor.prototype); // true
      
    /*2、构造器方式*/
    var Foo = function(){};
    var foo = new Foo();
    console.log(foo.constructor === Foo); // true 实例的constructor指向其构造函数
    console.log(foo.constructor === Foo.prototype.constructor); // true 原型上的constructor指向构造函数
    console.log(foo.__proto__ === Foo.prototype); // true 实例的__proto__等于构造函数的prototype
    console.log(foo.__proto__ === foo.constructor.prototype); //true
      
    /*3、Object.create()方式*/
    var a1 = {a:1}
    var a2 = Object.create(a1);
    console.log(a2.__proto__); //Object {a: 1}
    console.log(a.__proto__ === a.constructor.prototype); //false
    

    二、原型链

    由于__proto__任何对象都有的属性,而js里万物皆对象,所以会形成一条__proto__连起来的链条,递归访问__proto__,最终到null

    var A = function(){};
    var b = new A();
    console.log(b.__proto__ === A.prototype); //(即构造器function A 的原型对象)
    console.log(b.__proto__.__proto__ === Object.prototype); // Object {}(即构造器function Object 的原型对象)
    console.log(b.__proto__.__proto__.__proto__); //null
    

    三、Function和Object的关系

    解决为何:

    Function instanceof Object; //true

    Object instanceof Function; //true

    所有构造器的constructor都指向Function

      1.构造器Function的构造器是它自身
      Function.constructor=== Function; //true
    
      2.构造器Object的构造器是Function(由此可知所有构造器的constructor都指向Function)
      Object.constructor === Function; //true
      
      3.构造器Function的__proto__是一个特殊的匿名函数function() {}
      
      4.这个特殊的匿名函数的__proto__指向Object的prototype原型。
      Function.__proto__.__proto__ === Object.prototype//true
    
      5.Object的__proto__指向Function的prototype,也就是上面③中所述的特殊匿名函数
      Object.__proto__ === Function.prototype; // true  
      Function.prototype === Function.__proto__; // true
    

    解惑:

    Function instanceof Object; 
    
    Function.__proto__ => 特殊匿名函数
    特殊匿名函数.__proto__ => Object.prototype
    
    Object instanceof Function;
    Object.constructor = Function;
    Object.__proto__ => Function.prototype
    

    起源地下载网 » 前端八股文-原型链

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元