说到原型链不得不提到构造函数,任何一个对象都是由构造函数new出来的,其构造函数通过new来使用,作用是实例化对象。
原型:任何一个函数都有一个prototype属性。
下图就是构造函数,实例化,原型的关系图。
1.构造函数通过.prototype找到原型上的属性和方法。
2.实例化的对象能通过__proto__找到构造函数的原型的属性和方法。
3.这里特别注意实例化的对象是不能访问构造函数里面的属性和方法的(这里实例化对象只能访问它原型上的属性和方法)
function Person(name,age){
this.name = name;
this.age = age;
}
var p = new Person('张三','12')
Person.prototype.color='red';
Person.job='前端';
consoloe.log(p.name) //张三
consoloe.log(p.color) //red
consoloe.log(p.job) //undefined
原型链:
任何一个对象都有一个prototype属性,有prototype属性就有__proto__对象,(这里的__proto__就是原型),而__proto__对象又会有__proto__,这样一环一环就形成了原型链。
说白点就是__proto__相当于父亲,那么它是不是有爷爷,太爷爷,这样就形成了一个链式的结构就叫做原型链。
下面这个红框标出来的就是它的原型链
这个原型链简单理解就是,实例p的母亲是Person构造函数,父亲是Person.prototype。而Person.prototype的母亲就是Object构造函数,父亲就是Object.prototype,在往上就是null了。实例p最终可以使用原型链上的一切属性和方法,就是它能继承它父亲,父亲的父亲的财产(属性和方法),但母亲的,母亲的母亲的是不行的,(通俗的就是母亲只负责生,父亲负责养)