当执行 一个对象赋值操作的时候 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);//3 23 obj.d=6; 24 console.log(obj.d);//6 25 console.log(obj1.d);//3 26 27 // 第二种情况 28 Object.defineProperty(obj1,'ff',{ 29 value:11, 30 writable:false, 31 configurable:true, 32 enumerable:true 33 }) 34 console.log(obj.ff);//11 35 obj.ff=33; 36 console.log(obj.ff);//11 37 console.log(obj1.ff);//11 38 39 // 第三种情况 40 Object.defineProperty(obj1,'g',{//访问器属性 41 get:function(){ 42 return this.c 43 }, 44 set:function(val){ 45 console.log("我被执行了"); 46 this.c=val 47 }, 48 }) 49 console.log(obj.g);//2 50 obj.g=22; 51 console.log(obj.g);//22 52 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:读取