什么是原型对象
原型对象包括显示原型对象和隐式原型对象
显示原型对象:原型对象就是函数对象的一个属性prototype的值( 地址),这个prototype属性值是原型对象, 也被叫做显式原型对象.ES5中适合在原型内部添加东西---修改。
用console.dir(Villa);
可以查看
隐式原型对象:由这个函数实例化出来的对象身上都会有一个属性叫__proto__, 它和函数对象prototype地址一样, 代表同一个对象,如果我们通过__proto__去操作原型对象, 称为隐式原型对象。ES5中适合查看原型。
什么是原型链
描述的是对象在查找属性或者方法的过程
实例化对象在找属性或者方法的时候,先从自身去找看有没有这个属性或者方法,如果有,直接使用这个属性的值,如果没有,会继续顺着这个对象的隐式原型对象(__proto__)找到这个对象的原型对象(和它的构造函数的显式原型对象是同一个),看看原型对象是否存在这个属性,如果有就使用原型对象当中的这个属性值,如果还没有,再去找原型对象object的隐式原型对象(默认就是Object显式原型对象),找到以后去看看有没有这个属性,如果有就使用这个属性值;如果没有就返回undefined(代表已经找到顶了);
eg:有个函数villa,函数的显示原型对象是prototype,该对象和实例化出来的对象的隐式原型对象是指的同一个
那什么是原型链呢?
简单理解就是原型组成的链,对象的__proto__它的是原型,而原型也是一个对象,也有__proto__属性,原型的__proto__又是原型的原型,就这样可以一直通过__proto__想上找,这就是原型链,当向上找找到Object的原型的时候,这条原型链就算到头了。
原型对象和实例之间有什么关系呢?
通过一个构造函数创建出来的多个实例,如果都要添加一个方法,给每个实例去添加并不是一个明智的选择。这时就该用上原型了。
在实例的原型上添加一个方法,这个原型的所有实例便都有了这个方法。
以此推测用原型对象可以减少堆中开辟新的内存 ,从而减少内存的使用,提升页面的性能。