原型
原型就是对象
每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针,实例包含一个指向原型对象的内部指针。其他对象可以通过原型实现属性继承。
下面用例子解释一下:
//这是狗的构造函数
function Dog(species){
this.species=species;
this.introduce=function(){
alert(this.species);
}
}
//构造函数Dog()生了一只小狗叫dog1
var dog1=new Dog('Husky');
dog1.introduce();
在上面代码中,Dog()有个属性叫prototype,这个属性指向一个对象,这个对象包含了所有狗的实例的共享的属性和方法,这就是原型对象。
原型链
在上面例子中,Dog()有个属性叫prototype指向原型对象
dog1有个属性__proto__也指向这个原型对象
然后原型对象有个属性constructor指向构造函数Dog()
所有的对象都可以扩展属性,所有的对象都有__proto__属性,所有的函数都有prototype属性,所有对象的__proto__属性指向它的构造函数prototype属性。由于原型对象也是对象,所有它也有__proto__属性指向它的原型对象,原型链的核心就是依赖对象的__proto__指向,当自身不存在某个属性时,就往上一层找,直到Object
通过构造函数可以实例化对象,而每一个实例化对象都默认含有一个隐式的属性__proto__来指向该构造函数的原型对象。
在上图中:
- dog1的__proto__指向Dog.prototype,Dog.prototype的__proto__指向Object.prototype,Object.prototype的__proto__指向null
- 红线标注的constructor是继承来的属性