javascript 查找属性的过程

 当执行 一个对象赋值操作的时候  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:读取

猜你喜欢

转载自www.cnblogs.com/zhanghaiyu-Jade/p/10562373.html