博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript 查找属性的过程
阅读量:7086 次
发布时间:2019-06-28

本文共 2069 字,大约阅读时间需要 6 分钟。

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

转载于:https://www.cnblogs.com/zhanghaiyu-Jade/p/10562373.html

你可能感兴趣的文章
Java线程之并行
查看>>
2014年5月软考用书推荐&3年真题精解与闯关密卷创新点
查看>>
Unix IO模型学习
查看>>
实战Zabbix-Server数据库mysq的libdata1文件过大
查看>>
springboot 2.X 集成redis 以及缓存@Cacheable
查看>>
我的友情链接
查看>>
分布式环境下ID生成方法
查看>>
Win7添加Lookback接口
查看>>
iOS UIViewController 应用要点
查看>>
Centos ssh登录慢问题的解决办法
查看>>
centos6.3下haproxy+apache配置笔记
查看>>
InfluxDB学习笔记3---Chronograf
查看>>
我的友情链接
查看>>
zabbix系列之使用ansible批量部署zabbix客户端(二)
查看>>
Ansible简介
查看>>
开源社交系统---ThinkSNS V4.5直播版上线,PC端安装指南说明
查看>>
DEDECMS 常见错误
查看>>
Cacti 备份与迁移
查看>>
zabbix 监控ElasticSearch
查看>>
Oracle日志查看
查看>>