构造器:可以被 new 运算符调用, Boolean,Number,String,Date,RegExp,Error,Function,Array,Object 都是构造器,他们有各自的实现方式。

比如:var s=new String("test")

s的 [[Prototype]] 内部属性设定为标准内置的字符串原型对象,它是 String.prototype 的初始值。
s的 [[Class]] 内部属性设定为 "String"。
s的 [[Extensible]] 内部属性设定为 true。
s的 [[PrimitiveValue]] 内部属性设定为 ToString("test")。

除这些内置全局对象的构造器之外,还有创建的函数对象也可以用new运算符调用,因为在创建函数对象的过程中,设定了其内部属性[[Construct]],同时给它设置一个原型对象,这个原型对象和new Object创建的对象一样。

这里说明下函数对象的[[call]] ,[[Construct]],
var f=function(a,b,c){}
f()调用[[call]]内部属性方法,建立执行环境,返回返回值。
var ff=new f()调用[[Construct]]内部方法,创建一个空对象,并对其设置内部属性和方法,比如[[Prototype]]属性指向f的prototype。并以该对象为 this 值,调用参数列表,调用f的 [[Call]] 内部属性,如果返回一个对象则返回该对象,否则返回此前创立的空对象。

所以每个构造器有一个原型对象prototype。

每个对象都有一个内部属性[[Prototype]],它指向自己的构造函数的原型对象,同理,其构造函数的原型对象也有有一个内部属性[[Prototype]]指向自己的原型对象,这就形成原型链。当然这个原型链不是无穷的,Object的原型对象的[[Prototype]]是null。
拿Array为例:
Array的原型是数组原型对象,Array构造器的[[Prototype]]是函数原型对象。
当var arr=new Array()时,
arr的内部属性[[Prototype]]指向Array.prototype。

下面就来验证下:

var a=Array.call(this,2)
结果a是长度为2的空数组。其中call方法就继承自 Function.prototype

arr.push(1);
push继承自 Array.prototype

console.log(arr.prototype) //结果为 undefined,可见其没有原型对象了。
var arrNew=new arr() //TypeError: object is not a function 因为没有内部属性[[Construct]],抛出异常

再看
例2:
var f=function(){}
console.log(f.prototype) //Object {}
var ff=new f() //{}对象

原型对象prototype和原型属性[[Prototype]]的更多相关文章

  1. JavaScript OOP(三):prototype原型对象(即构造函数的prototype属性)

    通过构造函数生成的实例化对象,无法共享属性或方法(即每个实例化对象上都有构造函数中的属性和方法):造成了一定的资源浪费 function Obj(name,age){ this.name=name; ...

  2. 关于Function原型对象和Object原型对象的一些疑惑

    网上有一道美团外卖的面试题是这样的: Function.prototype.a = 'a'; Object.prototype.b = 'b'; function Person(){}; var p ...

  3. 对js原型对象、实例化对象及prototype属性的一些见解

    什么是原型对象? 请看下面的代码,我们以各种姿势,创建了几个方法! function fn1() { } var fn2 = function () { } var fn3 = new Functio ...

  4. 275 原型与原型链:显式原型prototype ,隐式原型__proto__,隐式原型链,原型链_属性问题,给原型对象添加属性/方法

    1.所有函数都有一个特别的属性 prototype : 显式原型属性 [普通构造函数的实例对象没有prototype 属性,构造函数有__proto__属性,原型对象有__proto__属性 ] 2. ...

  5. javascript原型对象prototype

    “我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法.” 引用类型才具有prototype属性 ...

  6. 理解js的prototype原型对象

    我们创建的每一个函数都有一个prototype(原型)属性.这个属性是一个指针,指向一个对象,而这个对象的用途是包括能够由特定类型的全部实例共享的属性和方法.假设依照字面意思来理解,那么prototy ...

  7. __proto__、prototype和原型对象

    一.__proto__ 对象内部存在一个指针,用来指向上一层函数的原型对象.ECMA-262第五版中关这个指针叫[[prototype]],但Firefox.Safari和Chrome在每个对象上都支 ...

  8. 构造函数、原型对象prototype、实例、隐式原型__proto__的理解

    (欢迎一起探讨,如果有什么地方写的不准确或是不正确也欢迎大家指出来~) PS: 内容中的__proto__可能会被markdown语法导致显示为proto. 建议将构造函数中的方法都定义到构造函数的原 ...

  9. 面试题常考&必考之--js中的难点!!!原型链,原型(__proto__),原型对象(prototype)结合例子更易懂

    1>首先,我们先将函数对象认识清楚: 补充snow的另一种写法: var snow =function(){}; 2>其次:就是原型对象 每当我们定义一个函数对象的时候,这个对象中就会包含 ...

随机推荐

  1. angularjs揭秘

    angularjs揭秘

  2. 高德地图-搜索服务-POI搜索

    高德地图-搜索服务-POI搜索 之前公司项目收货地址仿饿了么的收货地址,结果发现自己实现的关键字搜索和周边搜索,搜索到的poi列表跟饿了么的并不完全一样,后来考虑了下,应该是搜索的范围.类型之类的设置 ...

  3. 用电脑给手机安装App

    每一个账号密码只允许同时授权5台电脑,当授权满后还想授权其他的就必须删除以前的授权.    

  4. 移动web app开发必备 - Deferred 源码分析

    姊妹篇  移动web app开发必备 - 异步队列 Deferred 在分析Deferred之前我觉得还是有必要把老套的设计模式给搬出来,便于理解源码! 观察者模式 观察者模式( 又叫发布者-订阅者模 ...

  5. VMware Tools的简易安装---解决Ubuntu 14.10不能满屏显示问题

    由于使用的VMware WorkStation是中文破解版,安装时又是简易安装,因此VMware Tools并没有安装上,导致Ubuntu 14.10在VMware中装上之后,并不能满屏显示,如图1所 ...

  6. js的作业题

    <script type="text/javascript"> //var a=3; //switch(a) // { // case 1: // alert(&quo ...

  7. HTML中哪些标签的值会被提交到服务器呢?

    <form> <input name="">标签 <select name="">标签 <textarea name= ...

  8. jsonp跨域+ashx(示例)

    前言 做B/S项目的时候,我们一般使用jquery+ashx来实现异步的一些操作,比如后台获取一些数据到前台,但是如果ashx文件不在本项目下,引用的是别的域下的文件,这时候就访问不了.关于jsonp ...

  9. C算法编程题(四)上三角

    前言 上一篇<C算法编程题(三)画表格> 上几篇说的都是根据要求输出一些字符.图案等,今天就再说一个“上三角”,有点类似于第二篇说的正螺旋,输出的字符少了,但是逻辑稍微复杂了点. 程序描述 ...

  10. 1Z0-053 争议题目解析682

    1Z0-053 争议题目解析682 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 682.Identify the scenarios in which the RMAN CROS ...