原型链的理解
原型链:
1) __proto__属性
定义函数时,函数就有了prototype属性,该属性指向的对象是共享的。
为什么javascript中,为什么对象能够访问prototype中的属性和方法呢?
因为:当对象new构造函数创建时,对象会自带一个__proto__属性,这个属性是由
javascript分配的,这个属性是一个引用类型,它指向的是构造函数的原型。
2) 什么是原型链?
var Animal=function(){ this.name='animal'; this.sex='男'; } Animal.showName=function(){ alert(this.name) } var Dog=function(){ // this.name='dog' } Dog.prototype=new Animal(); var dog=new Dog(); console.log(dog.__proto__); console.log(dog.__proto__.__proto__); console.log(dog.__proto__.__proto__.__proto__); console.log(dog.__proto__.__proto__.__proto__.__proto__);
我们先看一下上面这部分代码,是一个通过原型链继承的,原型继承代码,而我们看到
的一系列的__proto__就是原型链了。
- 第一个打印的是Animal的实例
- 第二个打印的是Animal的原型对象
- 第三个打印的是Object对象
- 第四个打印的是null,因为Object对象没有__proto__属性
3) 原型链查找
原型链查找有一个就近原则,就好比上面代码如果实例上有带name属性,那么它就直
接拿name上的属性了,如果没有那么他会沿着原型链往上查找,知道查找到这个属性
为止