万物皆对象
在JavaScript中万物都是对象,对象和对象之间并不是独立存在的,对象和对象之间有一定关系。对于原型链,我们要知道一下几个:函数对象,实例对象、原型对象。
- 函数对象——就是平时称的对象;
- 实例对象——new出的对象或者{ };
- 原型对象——所有的函数对象都有一定有一个对应的原型对象,所有的原型对象都是被Object函数对象创建出来的。
原型链
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会通过它的__proto__属性指向函数的原型对象(函数.prototype,隐式原型)一层一层往上找,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,称为原型链。
原型对象 prototype:显示原型
原型是一个对象,是构造函数的一个属性prototype,它是函数所独有的;通过该构造函数实例化出来的对象都可以继承得到原型上的所有属性和方法,可以节约内存。构造函数与原型对象中的 this 都指向该函数的调用者。
对象原型 _proto_ : 隐式原型
只要是对象就存在该属性,指向构造函数的 prototype 属性。__proto__是浏览器自己对 [[prototype]] 所做的实现。也就是说,官方并未定义 [[prototype]] 叫什么,是浏览器自己根据标准制定出来的。 但是!在ES6官方把[[prototype]]作为对象的内部属性,可读不可写。
constructor 属性
prototype 与 _proto_ 都有的一个属性,且该属性都指向创建对象的构造函数本身。
instanceof 运算符
instanceof运算符可用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
示例如下:
function Parent(month){
this.month = month;
}
var child = new Parent('Ann');
console.log(child.month); // Ann
console.log(child.father); // undefined
console.log(child instanceof Parent);//true
在child中查找某个属性时,会执行以下步骤:
总结
- 所有对象都有一个_proto_属性,指向它构造函数的prototype
- 所有函数都有一个prototype属性,用来存放实例对象的共有属性和方法的公共对象
- 所有prototype和_proto_都有一个constructor属性,均指向创建对象的构造函数本身
- 原型链又叫隐式原型链,是由__proto__属性串联起来,原型链的尽头是Object.prototype