在JavaScript 中的所有事物都是对象:字符串、数字、数组、日期,等等。
但这里需要区分下Function(函数对象)和Object(普通对象):
凡是通过Function创建的对象都是函数对象,其他则都是为普通对象
好的,继续看下面:
这里定义了一个animal构造函数
1、每一个函数对象在被创建的时候都会有一个prototype属性,这个属性指向他的原型对象(原型)。
2、原型对象上又会有一个constructor属性和__proto__属性,这个constructor属性又会指向它的构造函数,这个__proto__属性指向的是它的构造函数的原型对象。
即animal.prototype.constructor = animal
下面通过animal构造函数实例化一个对象f1
这个f1对象也有一个_proto_属性,这个属性指向他的构造函数的原型对象。
即f1.__proto__ === animal.prototype
1、__proto__和constructor是对象所独有的
2、prototype是函数所独有的
前面说到了所有的对象都有__proto__属性,并且是指向它的原型对象(父对象)。当我们在本身查找一个属性时,如果对象本身不存在就会去__proto__指向的原型对象中去寻找,如果找不到,则继续向上寻找直到null,这便形成了一条原型链。且原型链的终点都是null。
为什么是null?
null: Null类型,代表“空值”,代表一个空对象指针,使用typeof运算得到 “object”,所以你可以认为它是一个特殊的对象值。
undefined: Undefined类型,当一个声明了一个变量未初始化时,得到的就是undefined。
显然,Object.prototype 没有进一步的原型并不是一种错误,并且对象如果有原型的话,应该是一个对象,因此没有原型应该以 null 表示,而不是以 undefined 表示。