zoukankan      html  css  js  c++  java
  • 谈谈令人头大的prototype 和__proto__

    首先要明确几个事情:

    prototype和__proto__

    1.prototype:
    每个函数都会有一个prototype这个属性,这个属性是一个指针,它指向一个对象,这个对象就叫做原型对象;

    原型对象也是一个对象它是由Object创建出来的实例!!!切记!!它也有__proto__,指向Object.prototype,而Object.prototype自己也是一个原型对象别的原型对象的__proto__都指向它

    那么它自己怎么办呢?它自己也不知道怎么办,所以它就懵逼了,指向了null,到这里就来到了原型链的终点了!!!!

    2.__proto__:

    每个对象都有一个__proto__,它指向创建它的那个构造函数的原型对象,有点绕啊!!而函数也是一个对象,(切记js里万物皆是对象这句话!!!)但是呢每个函数也都是一个对象

    你可以把函数理解成一个特殊的对象,它比较厉害,它不光有普通对象的__proto__,它还有自己独有的prototype,普通的对象是没有prototype的!!!!

    3.String  Array   Object   Function   Date   RegExp 。。。这些鬼东西其实都是构造函数啊!!!有点坑,他们都是由Function构造出来的包括Function自己,所以只要是函数都有prototype还有__proto__.

    总之记住一句话:每个对象都有一个__proto__,它指向创建它的那个构造函数的原型对象!!!!

    明白了这些就来做几道题目绕啊绕啊就忽然茅塞顿开啦!

    function Fn(){}
    
    var f1=new Fn();
    
    
    console.log(f1.__proto__===Fn.prototype)//true 指向创建自己的那个构造函数的原型对象
    
    console.log(Fn.__proto__===Function.prototype) //true 所有构造函数是函数对象,他们都是Function 的实例所以指向Function 的原型对象
    
    console.log(Function.__proto__===Function.prototype)//true Function本身也是一个构造函数,他自己的__proto__也是指向自身 的原型对象
    
    console.log(Function.prototype.__proto__===Object.prototype)//所有构造函数的原型对象的__proto__指向Object的原型对象,因为Object是这个原型对象的构造函数
    
    
    console.log(Object.prototype.__proto__)//null
    
    
    console.log(Array.__proto__===Function.prototype)//所有的内置函数都是构造函数,也是Function 的实例,所以 他们的__proto__指向Function的原型对象
    
    
    console.log(Function.prototype instanceof Object)//Function 这个构造函数的原型对象是Object的实例,是由它创建出来的 ,也就是说Object 是Function.protype
    //的构造函数!!!所有的原型对象的构造函数都是Object,所以所有构造函数的__proto__都指向Function.prototype
    
    console.log(Object.__proto__===Function.prototype)*/
    

    强化练习:

    var obj={}
    
    //console.log(obj.__proto__.__proto__===null)        //true    obj.__proto__指向Object.prototype ,Object.prototype 的__proto__指向null
    
    //console.log(obj.__proto__.constructor===Object)        //true   obj.__proto__指向Object.prototype ,Object.prototype的constructor指向Object
    
    //console.log(obj.__proto__.constructor.__proto__===Function.prototype)        //true 根据上一题得知本题相当于 Object.__proto__;而 所有构造函数的__proto__指向Funcion的原型对象
    
    //console.log(obj.__proto__.constructor.__proto__.__proto__===Object.prototype)    //true  本题相当于  Function.prototype.__proto__所以根据所有原型对象都是Object的实例得知为Object.prototype
    
    // console.log(obj.__proto__.constructor.__proto__.__proto__.__proto__===null)        //true  根据上一题本题相当于Object.prototype.__proto__ 只有这个原型对象Object.prototype例外 它指向null 原型链的终点
    
    //console.log(obj.__proto__.constructor.__proto__.__proto__.constructor.__proto__===Function.prototype) //true
    

      总结一下吧:

    //1. Function的__proto__指向其构造函数Function的prototype;
    //
    //2. Object作为一个构造函数(是一个函数对象!!函数对象!!),所以他的__proto__指向Function.prototype;
    //
    //3. 所有构造函数的的prototype方法的__proto__都指向Object.prototype(除了....Object.prototype自身);
    //
    //4. Object.prototype的__proto__指向null(尽头);

  • 相关阅读:
    改变UITabbar顶部分割线颜色
    UITableViewCell添加点击时改变字体的颜色、背景、图标
    【转】有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?
    AFNetworking https自签名证书 -1012 解决方案
    关于AFNetWorking 2.5.4之后版本编译报错问题解决方案
    UIImageView 使图片圆形的方法
    关于使用IQKeyBoardManager键盘还是被遮挡的问题解决方案
    关于ios7 以上版本 view被导航栏遮挡的问题 解决方案
    手动导入第三方工程/类库
    “请不要直接访问超全局$_GET数组”
  • 原文地址:https://www.cnblogs.com/MikePan/p/9216482.html
Copyright © 2011-2022 走看看