zoukankan      html  css  js  c++  java
  • prototype __proto__ Function

    我们创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象。(注意:是函数才有prototype属性)

    而__proto__属性每一个对象都有。

    在js中如果A对象是由B函数构造的,那么A.__proto__ === B.prototype

    所以:

    (1).__proto__ === Number.prototype//true

    http://blog.csdn.net/aitangyong/article/details/44837655

    结论1:Object.prototype只是一个普通对象,它是js原型链的最顶端。
    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. (typeof Object.prototype) === object;//true  
    2. Object.prototype.__proto__=== null;//true  
    3. Object.prototype.prototype === undefied;//true  
    Object.prototype只是一个普通对象(普通对象没有prototype属性,所以值是undefined),Object.prototype是js原型链的最顶端,它的__proto__是null(有__proto__属性,但值是null,因为这是原型链的最顶端)。
     
    结论2:在js中如果A对象是由B函数构造的,那么A.__proto__ === B.prototype。
    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. function Person()  
    2. {  
    3.       
    4. }  
    5. var obj = {};  
    6. alert(obj.__proto__ === Object.prototype);//true  
    7. alert(Person.__proto__ === Function.prototype);//true  
    javascript中对象是由Object创建的,函数是由Function创建的。
     
    结论3:内置的Object是其实也是一个函数对象,它是由Function创建的。
    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. Object.__proto__ === Function.prototype;  
    结论4:js中每一个对象或函数都有__proto__属性,但是只有函数对象才有prototype属性。
    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. //函数对象  
    2. function Person()  
    3. {  
    4.       
    5. }  
    6.   
    7. // 普通对象  
    8. var obj = {};  
    9.   
    10. obj.__proto__ === Object.prototype;//true  
    11. obj.prototype === undefined;//true  
    12. Person.__proto__ === Function.prototype;//true  
    13. Person.prototype !== undefined;//true  
    我们知道javascript正是通过prototype实现继承的。如果objA、objB都是由cFunction创建的,那么根据结论2,objA.__proto__ === objB.__proto__ === cFunction.prototype,也就是说objA和objB对象都继承了cFunction的prototype。原型链是基于__proto__形成的,继承是通过prototype实现的。
     
    结论5:Function.prototype是个特例,它是函数对象,但是没有prototype属性。其他所有函数都有prototype属性。
    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. (typeof Function.prototype) === function;//true  
    2. Function.prototype.prototype === undefined;//true  

    结论6:内置的Function也是一个函数对象,它是通过自己来创建自己的。
    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. (typeof Function.__proto__) === function;//true  
    2. Function.__proto__=== Function.prototype;//true  
    Function这个函数对象,由其自身通过Function函数构造的。
     
    结论7:函数也是对象,因为Function.prototype__proto__指向Object.prototype。
    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. (typeof Function.prototype.__proto__) === "object";//true  
    2. Function.prototype.__proto__=== Object.prototype;//true  

    最后提一下:原型链是基于__proto__形成的,继承是通过prototype实现的。
     
           每个对象都有一个__proto__属性,原型链上的对象正是依靠这个__proto__属性连结在一起的!  对于原型链上的一个对象obj,那么访问obj.xxx属性(方法也是属性)的过程是: 如果自身有xxx属性,则访问它;如果没有,就通过__proto__属性找到其原型链的上一级原型对象,看它有没有xxx属性,如此递归查找,直至找到xxx属性或到了原型链顶端Object.prototype对象为止。
     
    函数拥有prototype属性,该属性值是一个object类型。当函数A创建对象B的时候,B对象的__proto__会指向A.prototype,这就是javascript的继承。
     
  • 相关阅读:
    如何垂直居中一个浮动元素?
    微信小程序vant-search获取不到输入的搜索内容踩坑
    关于微信小程序无法使用css3过度属性transition以及微信小程序如何利用api进行画面过度的展示
    Spring Shedule Task之注解实现 (两次启动Schedule Task 的解决方案)
    学习站点记录
    Spring 通过配置文件注入 properties文件
    Liunx下安装jdk
    Mybatis使用generator自动生成映射配置文件信息
    Tomcat容器虚拟路径设置
    Spring init-method和destroy-method 的使用
  • 原文地址:https://www.cnblogs.com/darr/p/5004617.html
Copyright © 2011-2022 走看看