先铺垫下原型规则:数组
1.全部的引用类型(数组,对象,函数)都具备对象特性,可自由扩展属性(出了null外)浏览器
2.全部的引用类型(数组,对象,函数)都有一个__proto__属性(隐式原型),属性值是一个对象函数
3.全部的函数都有一个prototype属性(显示原型),属性值是一个对象spa
4.全部的引用类型(数组,对象,函数),__protot__属性值指向他的构造函数的prototype属性值(new出来对象自身的(__protot__)隐式原型就是他构造函数的(prototype)显示原型)prototype
5.当试图去获得一个对象的某个属性时,若是这个对象自己没有这个属性,那么会去他的__proto__(即他的构造函数的prototype)中寻找对象
看例子:blog
例子中new出来的f对象是只有name属性(第3行建立的)和printName方法(第10行建立的),第15行中调用f.alertName.而alertName直接在f对象自己中是没有的,那么会去他的__proto__(即他的构造函数Foo的prototype)中寻找(在第5行)原型链
这就引出了原型链原型
当咱们访问对象的一个属性或方法时,它会先在对象自身中寻找,若是有则直接使用,
若是没有则会去原型对象中寻找,一直往上找(像冒泡同样),浏览器防止无限循环,找到最上层就是object了(祖先),再往上找就是null扩展
拓展:
使用hasOwnProperty()方法来检查该属性是new出实例对象自身中含有的仍是在原型中含有的,当对象自身中含有属性时,会返回true,
对比in,使用in检查对象中是否含有某个属性时,若是对象中没有可是原型中有,也会返回true,因此hasOwnProperty()更严格,