当执行 一个对象赋值操作的时候 js引擎会怎样处理呢???
例如 有个foo对象 ,要进行这个操作 foo.a=2
1, 首先会在foo对象中查找,如果不存在a属性,就会去原型链上面找,如果原型链上面也不存在该属性,就会在foo对象中创建一个a属性并且值为2
2 , 如果foo对象中不存在,在原型上层找到了a 属性,之后会进行一下三种情况:
①,如果原型上层的a属性是普通数据属性,且不是只读属性,那么就会在foo对象中创建一个a属性并且值为2,屏蔽了原型上层的a属性
②,如果原型上层的a属性是只读属性,那么该操作会被忽略,在严格模式下,会报错
③,如果原型上层的a属性是存储器属性,那么就会调用setter方法,不会在foo对象中创建a属性,也不会重新定义a这个setter
下面是些例子:
1 // var obj={ 2 // a:1, 3 // b:2, 4 // } 5 6 // 第一种情况 7 var obj1={ 8 //数据属性 9 c:2,10 d:3,11 e:function(){12 return this.c;13 }14 }15 // obj.__proto__=obj1;16 function f(){17 this.a=1;18 this.b=2;19 }20 f.prototype=obj1;21 var obj=new f();22 console.log(obj.d);//323 obj.d=6;24 console.log(obj.d);//625 console.log(obj1.d);//326 27 // 第二种情况28 Object.defineProperty(obj1,'ff',{29 value:11,30 writable:false,31 configurable:true,32 enumerable:true33 })34 console.log(obj.ff);//1135 obj.ff=33;36 console.log(obj.ff);//1137 console.log(obj1.ff);//1138 39 // 第三种情况40 Object.defineProperty(obj1,'g',{ //访问器属性41 get:function(){42 return this.c43 },44 set:function(val){45 console.log("我被执行了"); 46 this.c=val47 },48 })49 console.log(obj.g);//250 obj.g=22;51 console.log(obj.g);//2252 console.log(obj1.g);//2
总结的方法:
for...in.. 遍历对象中所有可枚举的属性(包括自有属性和继承的属性) Object.keys() 返回值是数组,由对象中可枚举的自有属性名称组成 Object.getOwnProperty() 返回对象的自有属性 (括可枚举和不可枚举) Object.hasOwnProperty(x) 检测x是否是对象的自有属性,对于继承的属性它返回false Object.isPrototypeof(x) 检测某对象是否是x对象的原型(或处于原型链中) Object.propertyIsEnumerable(x) 检测x属性是自有属性且这个属性是可枚举的它返回true Object.getOwnPropertyDescriptor(obj, prop) 可获取某对象的自有属性的属性描述符 Object.getOwnPropertyNames() 返回对象的所有自有属性名称(包括可枚举和不可枚举) Object.getPrototypeof(x) 可以查询x的原型 数据属性四个特性 1)configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为true 2)enumerable:表示能否通过for-in循环返回属性 3)writable:表示能否修改属性的值 4)value:包含该属性的数据值。默认为undefined 存储器属性四个特性 1)configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为true 2)enumerable:表示能否通过for-in循环返回属性 3)set:写入 4)get:读取