Prototype1.每个对象都有自己的原型。图中obj和info都有自己的隐式原型,分别指向各自的原型对象。打印代码时,js会先去对象obj或者info中寻找属性,类似于console.log(obj.name)//peter当js找不到对象上的target属性时,他会去对象的原型去寻找属性,如果在原型上没有找到,则输出空值。console.log(obj.address)//undefinedprototypechain1.属性查找过程中存在原型链。属性搜索将沿着这条链向上。图中info的隐式原型指向obj对象,obj的隐式原型指向它的原型对象,形成一个原型链,用代码的形式描述:constobj={age:18name:'peter'}constinfo={}info.__proto__=obj当我们打印属性时:console.log(info.name)//peterconsole.log(info.age)//18这时候我们会发现name和info上不存在age这两个属性,但是js会沿着这个原型链查找,会在obj中找到name和age,并输出这个结果2.原型链中有顶层原型。当我们沿着这个原型链往上找属性的时候,它会有一个终点,就是顶层原型。如果在顶层原型中没有找到目标属性,将输出一个空值。我们平时创建对象的时候,一般都是使用字面量创建,也就是下面这样的写法:constobj={}其实这个方法是一种语法糖。js的内部创建方法其实就是这种创建方法:constobj=newObject()js内部创建方法的本质就是使用这里我们先回顾一下使用构造函数创建对象的内部操作:(1)创建一个实例对象(2)将this指向实例对象(3)将实例对象的隐式原型__proto__赋值给构造函数函数的原型(4)执行函数中的代码(5)返回实例对象.第三步,改变实例对象的隐式原型指针:所以obj的隐式原型指向的原型对象就是顶层原型。补完上面提到的info和obj图:当我们在info中打印地址的时候,js会先去info中找,如果在info中没有找到,就会去obj中找,在Obj中没有找到,最后去顶层原型查找,如果没有找到,则输出undefined:console.log(info.address)//undefined
