读取:
-先在自己身上找,找到即返回
-自己身上找不到,则沿着原型链向上查找,找到即返回
-如果一直到原型链的末端还没有找到,则返回undefined
值类型成员写入(实例对象.值类型成员= xx):
-当实例期望重写原型对象中的某个普通数据成员时实际上会把该成员添加到目己身上
-也就是说该行为实际上会屏蔽掉对原型对象成员的访问
引用类型成员写入(实例对象.引用类型成员= xx):
-同上
复杂类型成员修改(实例对象.成员.xx = xx):
-同样会先在自己身上找该成员,如果自己身上找到则直接修改
-如果自己身上找不到,则沿着原型链继续查找,如果找到则修改
-如果一直到原型链的末端还没有找到该成员,则报错(实例对象. undefined.xx = xx)
<script> // 自定义构造函数 function Person(name,age) { this.name = name; this.age = age; } // 将所有实例共享的属性和方法,都添加给原型对象 Person.prototype.type = “human”; Person.prototype.sayName = function () { console.log(this.name); }; // 添加一个新的属性给原型对象,值是一个对象类型 Person.prototype.address = { city : “北京” }; // 生成对象实例 var person1 = new Person(“Bob”,18); var person2 = new Person(“Mike”,20); // 读取 属性和方法 // console.log(person1.type); // console.log(person1.city); // console.log(person1.sayName); // person1.sayName(); // 通过实例对象添加新成员,会直接添加给自己,会屏蔽掉对原型对象的访问 person1.sex = “male”; person1.sayAge = function () { console.log(this.age); }; // 如果通过实例对象更改原型对象的属性和方法,会直接添加给自己,会屏蔽掉对原型对象的访问 person1.type = “person”; person1.sayName = function () { console.log(this.name); } console.dir(person1); // 通过实例对象更改原型对象中复杂类型数据中的内容,还是会进行原型链的查找 person1.address.city = “上海”; </script>