JS中的原型和原型链

原型对象

定义:每一个构造器中都有一个属性叫prototype,它的值是一个对象,这个对象我们叫做原型对象。

隐式原型

定义:每一个对象中都有一个属性叫__protp__,它指向了创建这个对象的构造器的原型对象。

原型链

定义:是一个对象属性的查找机制 类似于作用域链,举个例子var arr=new Array(1,2,3),如果现在调用一个arr.toString()方法,那么就先在自己的私有属性中找,如果找不到就沿着__protp__去原型对象中找,如果还找不到就沿着原型对象的__protp__,去其原型对象的原型对象中去找,直到找到Object的原型对象。(Object原型对象中的__protp__,指向了null),如果还找不到,结果就是und,但是在执行代码时会报错。整个图片
JS中的原型和原型链
首先这个是arr的原型对象,其中constructor指向的为其构造器,
JS中的原型和原型链
这个时arr原型对象,的原型对象(在这里是Object的原型对象),constructor指向的为其构造器Object,可以发现这里面有我们所需要的方法。
JS中的原型和原型链
这里可以看出 Object的原型对象中并没有找到__protp__,这个并不是说Object的原型对象中没有__protp__,而是因为其指向的为null,这里不显示罢了。我们可以写个代码验证一下。
JS中的原型和原型链
直接整个流程图需要注意一点的是,在用new创造一个对象时,构造器先创建原型对象的,其次再创建对象。
JS中的原型和原型链
整一个例子:注意var f1=new Fn;
JS中的原型和原型链
再整一个 *****很重要 注意Fn.prototype=new Fn之后,因为是new Fn创建的对象(咱先叫new Fn),所以new Fn的__protp__指向Fn的原型对象,但之句话的执行顺序是先创建new Fn对象,然后在将其地址赋给Fn.prototype,执行完之后new Fn就成为了新的Fn的原型对象,故而下面执行let f=new Fn,生成的f1对象的__protp__指向的是new Fn对象。(因为只要new+构造器 所生成的对象 其__protp__指的就是构造器的原型对象。) 下面这俩例子就很容易看出来
JS中的原型和原型链
再来一个,需要注意的是如果将Fn构造器中的prototype给一个新的地址对象f1,但这个f1并不是new+Fn构造器所生成的,所以其__protp__指向的是object的原型对象。并不会指向之前Fn的原型对象

JS中的原型和原型链