每一个函数创建出来的对象不同,函数包括了自定义函数和官方提供的函数
官方提供的函数:String,Number,Array,Boolean,Object,Date,Math,Function
1.Array
var a=nwe Array()<==>var a=[],所创建的是一个数组
那么数组的原型链如下
这个数组对象就是a所创建的数组,如果用a.__proto__,所得的就是上一层的具有数组功能的层,如果再用a.__proto__.__proto__,所得的就是再上一层只有取值存值等功能的层,那再使用一次呢,a.__proto__.__proto__.__proto__,所得的就是最null
注意!用console.log(typeof null)打印出来的类型为Object,但是null被列为基本数据类型
注意!以上虽然是数组的原型链,但是如果创建一个对象var b=new Object(),b.__proto__的原型对象是在取值存值那一层,因此,数组和对象具有部分相同的功能
2.与函数fn()比较
function fn(){}
var f1=new fn();
var arr1=[1,2,3];
console.log(f1.__proto__.__proto__===arr1.__proto__.__proto__)
先上结论: console.log(f1.__proto__.__proto__===arr1.__proto__.__proto__)
注意!在new fn()中有一行隐式代码:fn.prototype=new Object()
所以f1.__proto__,并不等于上面原型链中取值存值那一层,而是单独的一层与数组的不一样
f1.__proto__=new Object;
f1.__proto__.__proto__=Object.prototype;
arr1.__proto__=Array.prototype<==>new Object()
arr1.__proto__.__proto__=Object.prototype;