知识点:
对象是一个属性的集合,有显示和隐式属性,并且都拥有一个单独的原型对象[prototype object], 一般用__proto__表示。
当查找一个对象的属性时,JavaScript 会先在显示属性中查找,找不到会向上遍历原型链,直到找到给定名称的属性为止。到查找到达原型链的顶部——也就是 Object.__proto__ ,但是仍然没有找到指定的属性,就会返回 undefined。
注:
hasOwnProperty是Object.prototype的一个方法, 是 JavaScript 中唯一一个处理属性但是不查找原型链的函数。
函数中prototype是一个显示的属性,创建实例对象(也就是new)的时候除了创建对象外,还做了另一件有用的事情——自动为创建的新对象设置了原型对象(prototype object)。
例1:
var parent = {
label:'parent'
}
var child = {
name:'child'
}
//设置原型
child.__proto__ = parent;
console.log(child.name); //child
console.log(child.label); //parent
以上代码中演示了对象属性查找。当访问child.name时,name存在child显示属性中,终止查找返回字符串child。当访问child.label时,先在child的显示属性中查找,没有找到然后在child的原型(child的原型__proto__为parent)中找,在child的原型中找到显示属性label,直接返回字符串parent。如果此时在该显示属性中还没有找到,会继续在child的原型(parent)的原型中查找,找到直接终止,没有找到一直向上找出,直到到达顶部Object.__proto__会终止查找。
例2:
function Parent(){
}
Parent.prototype.label = 'parent';
var child = new Parent();
console.log(child.__proto__ === Parent.prototype); //true
console.log(child.label); //parent
以上代码中,prototype是Parent的显示属性。当实例child(new Parent())的时候,先创建一个新对象,然后吧Parent中的prototype属性赋值到新对象的__proto__属性。当访问child的label属性时,依据对象属性查找的规则,现在child的显示属性中查找,没有找到然后在child的原型(__proto__)中找(也就是Parent.prototype.label),这儿找到了然后直接终止返回字符串parent。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。