首先,js的数据结构有 原始类型(5种):Boolean、Number、String、Null、Underfined,数据结构
而后是引用类型:Array、Date、Error、RegExp、Function、Object,注意这里,引用类型的返回值,其实只有2种,也就是Function和Object,用typeof就能够判断出。函数
js一切都是对象,Function天然也是对象,甚至Function比Object的功能更强大,new Function出来的变量,好比:spa
function Foo(){} var foo = new Foo(); typeof Foo //function typeof foo //object
Function和Object的区别,重点来了,Function有prototype属性,而Object是没有的:prototype
console.log(Foo.prototype) //Object console.log(foo.prototype) //undefined
下面来讲原型链和继承:指针
js是经过__proto__来明确继承 的关系,__proto__不一样于prototype,由于__proto__是对象的属性,所以Function和Object都有这个属性,在强调一下,Object是没有prototype的,而Function和Object都有__proto__属性。code
而后看一下__proto__这个属性是怎么工做的,例如:对象
var a = {aa:1}; var b = {bb:2}; var c = {cc:3}; a.__proto__ = b; b.__proto__ = c; console.log(a.aa);//1 console.log(a.bb);//2 console.log(a.cc);//3
这就简单的实现了继承,也就是原型以及原型链。既然__proto__解决了继承的问题,那么prototype干什么呢?固然有它本身的用处,再回到上一个例子:blog
function Foo(){} var foo = new Foo(); console.log(Foo.prototype===foo.__proto__)//true
精髓就在于此:经过new构造函数构造出来的实例对象foo,它的__proto__属性,实际上是一个指针,它指向的是构造函数Foo的prototype属性。继承
为了便于之后复习,我总结一下上面内容,可能有理解不对的地方,但愿大神指正。原型链
一、object.__proto__指向他的原型对象,若是他的原型对象的__proto__还有上面的原型对象,好比:
var a = {aa:1}; var b = {bb:2}; var c = {cc:3}; a.__proto__ = b; b.__proto__ = c;
那么,a就继承了c的属性和方法,这就是原型和原型链,继承就是这样实现的。
二、关于prototype和__ptoto__:
首先,Function和Object都属于引用类型(平级的),都是对象,所以,都具备__proto__属性。
其次,Function有prototype属性而Object没有。
prototype和__ptoto__二者的关系是,实例对象的__proto__指向的就是构造函数的prototype:
function Foo(){} var foo = new Foo(); console.log(Foo.prototype===foo.__proto__)//true