1 为什么 xx.constructor.prototype 可以访问到当前对象的原型。
'str'.constructor.prototype
     'str'.constructor 指向当前对象的构造函数
          (构造函数).prototype:即函数的prototype 属性
               1 函数有prototype属性,所以可以访问到
               2 函数的prototype属性会在创建实例的时候作为实例的原型而存在。
                    所以 'str'.constructor.prototype 就可以访问到当前对象实例的原型。 
1   
     'str'.constructor  == String
     true.constructor == Boolean
     (1).constructor == Number
     {}.constructor == Object
     [].constructor == Array
     function(){}.constructor == Function
 
 
2
    Array.constructor
    Object.constructor
    Function.constructor
    Number.constructor
    String.constructor
    Boolean.constructor
 
result:全部都是:function Function(){}
推论:
     内置对象的构造器,全部都是 function Function(){},包括Function本身。
     所以js所有的内置对象的构造器都是 function Function(){}
 
 
3
 
     Number.__proto__ === Function.prototype  // true
     Boolean.__proto__ === Function.prototype // true
     String.__proto__ === Function.prototype  // true
     Object.__proto__ === Function.prototype  // true
     Function.__proto__ === Function.prototype // true
     Array.__proto__ === Function.prototype   // true
     RegExp.__proto__ === Function.prototype  // true
     Error.__proto__ === Function.prototype   // true
     Date.__proto__ === Function.prototype    // true
 
4
     Function.prototype.__proto__ == Object.prototype
     Object.prototype.__proto__ == Object.prototype
     Number.prototype.__proto__ == Object.prototype
     Boolean.prototype.__proto__ == Object.prototype
     String.prototype.__proto__ == Object.prototype
     Array.prototype.__proto__ == Object.prototype
     RegExp.prototype.__proto__ == Object.prototype
     Error.prototype.__proto__ == Object.prototype
     Date.prototype.__proto__ == Object.prototype
 
推论:
     1 只有函数才有 prototype属性
     2 所以上面的 XXX.prototype 中的XXX都是构造函数
     3 又有2中的 XXX.__proto__
    所以:XXX既可以是内置对象,也可以是构造函数。根据情景判断。
 
结论: Object的所有实例的原型都是 Object.prototype
 
 
Object.constructor == Function
Function.prototype.__proto__ == Object.prototype;
并且:Object.prototype.__proto__ == null;
 
 
Prototype
 
1 js的对象都拥有内部属性 [[prototype]] 指向其原型对象。
[[prototype]] 被称为 原型属性。
 
2 内部属性不可以直接访问.error: obj[[prototype]],但是可以间接访问 [[prototype]]
    a  ECMA:标准对象原型访问器Object.getPrototype(object)(到目前为止只有Firefox和chrome实现了此访问器);
    b  非标准访问器:__proto__(除了IE)
    c  obj.constructor.prototype
 
js的一切皆是对象,所以 函数也是对象.又因为对象拥有内部属性 [[prototype]],所以
函数也拥有内部属性 [[prototype]].
 
其次:函数同时拥有属性 prototype.prototype属性和 [[prototype]]并非同一个属性。
prototype属性指向一个对象,称为原型对象。
所以:一个函数的原型属性(function’s prototype property ) 和函数实际的原型(prototype)没有关系
 
原型对象的作用:
    当函数fn被用作构造函数时,其所创建的所有实例的 内部属性 [[prototype]] 指向 fn 的 prototype属性。
 
原型的作用:
1 构建原型链
    当对象调用某个方法时,如果其本身不存在此方法,就会往其原型中寻找,直到原型链的顶端。
原型链的作用:
    多个实例都需要的方法可以被抽出放到原型中,从而只需要定义一次,实现多个对象共享方法
 
 
 
Constructor
JS的所有对象都拥有constructor属性,指向其构造函数。
函数的原型对象也是对象,所以原型对象也拥有constructor属性。
并且JS定下了规则:
    fn.prototype.constructor == fn;
    即: 函数的prototype属性的constructor字段,指向当前prototype属性的拥有者,也就是构造函数本身。
 
由 fn.prototype.constructor == fn;推导出来的结论:
    构造函数的实例的 constructor属性 指向其构造函数。
推导:
          var a = new fn();
          首先在a本身寻找:没有找到 constructor属性.再往原型链向上查找,找到a的原型,也就是 fn.prototype,发现了 constructor属性
               所以就相当于 构造函数的实例的 constructor属性始终指向其构造函数。
 
 
 
 

prototype 以及 constructor 属性的理解的更多相关文章

  1. 构造函数的prototype和constructor属性

    Car.prototype = { name:'BMW', height:1400, long:4900 } function Car(color,owner){ this.color = color ...

  2. js中prototype,constructor的理解

    连看4篇前辈的文章,记录一些知识点 Javascript继承机制的设计思想 Javascript 面向对象编程(一):封装 Javascript面向对象编程(二):构造函数的继承 Javascript ...

  3. JavaScript中的 prototype 和 constructor

    prototype属性  任何js函数都可以用作构造函数, 而构造函数需要用到prototype属性, 因此, 每个js函数F(除了ES5的Function.bind()方法返回的函数外) 都自动拥有 ...

  4. 怎样理解prototype对象的constructor属性

    function Person(name){ this.name = name; } var lilei = new Person("Lilei"); lilei.construc ...

  5. prototype属性的理解

    1.对象:对象是JS的基本数据类型(原始类型(数字.字符串和布尔值),对象类型).对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值. 2.三类JS对象和两类属性: 内 ...

  6. JavaScript 构造函数 prototype属性和_proto_和原型链 constructor属性 apply(),call()和bind() 关键字this

    1.构造函数: 通常构造函数首字母需要大写,主要是为了区别ECMAScript的其它函数.(高程三 P145) 构造函数与其他函数的唯一区别,就在于调用它们的方式不同.只要通过new来调用,任何函数都 ...

  7. JavaScript的原型链继承__propt__、prototype、constructor的理解、以及他们之间相互的关系。

    回想自己已经工作了有一段时间了,但是自己对JavaScript的原型链.和继承的理解能力没有到位,最近他们彻底的整理并且复习了一遍. 本案例中部分文案来自网络和书籍,如有侵权请联系我,我只是把我的理解 ...

  8. JS中的prototype、__proto__与constructor属性

    作为一名前端工程师,必须搞懂JS中的prototype.__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞 ...

  9. 关于prototype属性的理解

    众所周知,prototype是一个属性对象,只要创建一个新函数,就会根据特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象.在默认情况下,所有原型对象都会自动获得一个cons ...

随机推荐

  1. js插件库+bootstrap

    1.Chart.js 官网地址:http://chartjs.cn/ 2.优秀的bootstrap模板推荐 官网地址:http://bootswatch.com 3.wow+animate+js插件库 ...

  2. numpy和matlab计算协方差矩阵的不同(matlab是标准的,numpy相当于转置后计算)

    matlab是标准的,numpy相当于转置后计算 >> x = [2,0,-1.4;2.2,0.2,-1.5;2.4,0.1,-1;1.9,0,-1.2] x = 2.0000    0 ...

  3. JS 数组的一些方法

    1.push() //可以接受任意参数,然后添加到数组的末尾 2.pop()//栈方法,在数组末尾删除一条数据,并且返回这条数据 3.shift()//队列方法,与pop()相似,但是与其相反,在数组 ...

  4. VMware虚拟机重置密码

    1.给vmware虚拟机添加启动延时          1.1 编辑VMware的配置文件.vmx,开机就自动进入BIOS       加入一行:bios.forceSetupOnce = " ...

  5. df查看分区使用情况

    Linux df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计.语法 df [选项]... [FILE]...     -a, --all 包含所有的具有 0 Blocks 的文件系统 ...

  6. Debian安装Docker

    Debian 安装 Docker CE 准备工作 系统要求 Docker CE 支持以下版本的 Debian 操作系统: Stretch 9 Jessie 8 (LTS) Wheezy 7.7 (LT ...

  7. window.parent ,window.top,window.self 详解及parent和opener的区别

    window.parent ,window.top,window.self 详解 在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层fr ...

  8. Umbraco 的template使用的默认Model问题

    Umbraco中的Template默认都继承自 Umbraco.Web.Mvc.UmbracoTemplatePage @inherits Umbraco.Web.Mvc.UmbracoTemplat ...

  9. easyui学习笔记1-(datagrid+dialog)

    jQuery EasyUI是一组基于jQuery的UI插件集合体.我的理解:jquery是js的插件,easyui是基于jquery的插件.用easyui可以很轻松的打造出功能丰富并且美观的UI界面. ...

  10. 《鸟哥的Linux私房菜》读书笔记2

    1. 压缩后缀与压缩程序: *.Z compress 程序压缩的档案; *.bz2 bzip2 程序压缩的档案; *.gz gzip 程序压缩的档案; *.tar tar 程序打包的数据,并没有压缩过 ...