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,可以知道自己是用哪个构造函数构造出来的相当于自己的类