javascript中的__proto__, prototype和constructor

JavaScript 中的所有事物都是对象:字符串、数值、数组、函数...

此外,JavaScript 允许自定义对象。


1》__proto__

javascript中一切都是对象,每个对象都是基于原型对象创建的,每个对象中都有__proto__属性,这个属性指向的就是它基于的原型对象。

__proto__属性是系统(浏览器)自动给创建的,在对象被创建的时候自动指向基于的原型对象。

 

比如:

 

function Foo(){

 

}

 

var foo=new Foo();

 

foo.__proto__指向的就是Foo.prototype


因为Foo函数本身也是个对象,所以Foo.__proto__指向的是Function.prototype


Function.prototype本身也是对象,所以Function.prototype.__proto__指向的是Object.prototype

 

2》prototype

只有构造函数对象才有prototype属性,构造函数的作用是创建对象,创建对象的时候,它要知道这个对象基于哪个原型来创建,这个prototype指向的就是这个原型。

prototype属性也是系统(浏览器)给创建的,并指向创建对象时基于的原型。

注意不是构造函数本身基于的原型,本身基于的原型都是Function.prototype。

比如:

 

function Foo(){

 

}

//系统自动把Foo的prototype属性指向Foo.prototype

//所以,new Foo()的时候,就基于Foo.prototype来创建,

//foo.__proto__就是Foo.prototype

var foo=new Foo();

 

foo.__proto__和Foo.prototype指向的都是Foo.prototype。

自定义一个Foo构造函数的时候,系统默认会自动指定一个Foo.prototype原型对象,其实就是一个Object对象。

3》constructor

只有原型对象才有constructor属性,而且也是系统(浏览器)给创建的。前面说过构造函数对象的prototype属性会指向一个原型对象,那么这个原型对象中的constructor属性指向的就是这个构造函数。

constructor属性其实是给自定义对象使用的,自定义对象通过constructor属性就可以知道自己是用哪个构造函数new出来的。比如:

function Foo(){

 

}

 

var foo=new Foo();

 

alert(foo.constructor)  // function Foo(){}

// foo中没有constructor,foo访问的是它的原型Foo.prototype中的constructor属性。

 

一个对象被new出来以后,就可以知道自己的两方面事情:

1. 通过foo.__proto__,可以知道自己是基于哪个原型创建出来的,相当于自己的父类

2. 通过foo.constructor,可以知道自己是用哪个构造函数构造出来的相当于自己的类


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值