原型对象prototype和原型属性[[Prototype]]

构造器:能够被 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")。this

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

这里说明下函数对象的[[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.prototypeit

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() //{}对象

相关文章
相关标签/搜索