成员查找机制
当访问一个实例对象的成员的时候,JavaScript首先会判断实例对象有没有这个成员,如果有,就直接使用,如果没有,再判断原型对象中有没有这个成员。如果在原型对象中找到了这个成员,就使用,没有找到,就继续查找原型对象的原型对象,如果直到最后都没有找到,则返回undefined。下面我们通过代码演示对象成员的查找顺序。
1 function Person() {
2 this.name = '张三';
3 }
4 Person.prototype.name = '李四';
5 var p = new Person();
6 console.log(p.name); // 输出结果:张三
7 delete p.name; // 删除对象p的name属性
8 console.log(p.name); // 输出结果:李四
9 delete Person.prototype.name; // 删除原型对象的name属性
10 console.log(p.name); // 输出结果:undefined
需要注意的是,成员查找机制只对访问操作有效,对于添加或修改操作,都是在当前对象中进行的。具体示例如下。
1 function Person() {}
2 Person.prototype.name = '李四';
3 var p = new Person();
4 p.name = '张三';
5 console.log(p.name); // 输出结果:张三
6 console.log(Person.prototype.name); // 输出结果:李四
从上述代码可以看出,为对象p的name属性赋值“张三”后,原型对象中同名的name属性的值没有发生改变。