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
下面是些例子:
// var obj={
// a:1,
// b:2,
// } // 第一种情况
var obj1={
//数据属性
c:2,
d:3,
e:function(){
return this.c;
}
}
// obj.__proto__=obj1;
function f(){
this.a=1;
this.b=2;
}
f.prototype=obj1;
var obj=new f();
console.log(obj.d);//
obj.d=6;
console.log(obj.d);//
console.log(obj1.d);// // 第二种情况
Object.defineProperty(obj1,'ff',{
value:11,
writable:false,
configurable:true,
enumerable:true
})
console.log(obj.ff);//
obj.ff=33;
console.log(obj.ff);//
console.log(obj1.ff);// // 第三种情况
Object.defineProperty(obj1,'g',{//访问器属性
get:function(){
return this.c
},
set:function(val){
console.log("我被执行了");
this.c=val
},
})
console.log(obj.g);//
obj.g=22;
console.log(obj.g);//
console.log(obj1.g);//
总结的方法:
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:读取
javascript 查找属性的过程的更多相关文章
- css z-index属性使用过程中遇到的问题
z-index属性在web开发中会经常使用,其主要的作用简单的说就是把元素的position设置为absolute.fixed之后,可以调节元素在文档上的层级关系.比如经常见到的dialog,mask ...
- JavaScript对象属性的基础教程指南
JavaScript是使用“对象化编程”的,或者叫“面向对象编程”的.所谓“对象化编程”,意思是把JavaScript能涉及的范围划分成大大小小的对象,对象下面还继续划分对象直至非常详细为止,所有的编 ...
- Javascript对象属性与方法汇总
Javascript对象属性与方法汇总 发布时间:2015-03-06 编辑:www.jquerycn.cn 详细介绍下,javascript对象属性与对象方法的相关知识,包括javascript字符 ...
- javascript引擎执行的过程的理解--执行阶段
一.概述 同步更新sau交流学习社区(nodeJSBlog):javascript引擎执行的过程的理解--执行阶段 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍 ...
- JavaScript document属性和方法
JavaScript document属性和方法 --------------------------------------------属性: 1. Attributes 存储节点的属性列表 ...
- JavaScript 全局属性/函数
JavaScript 全局 JavaScript 全局属性和方法可用于创建Javascript对象. JavaScript 全局属性 属性 描述 Infinity 代表正的无穷大的数值. NaN 指示 ...
- 删除要被替换的元素的所有事件处理 程序和 JavaScript 对象属性
使用本节介绍的方法替换子节点可能会导致浏览器的内存占用问题,尤其是在 IE 中,问题更加明显.在删除带有事件处理程序或引用了其他 JavaScript 对象子树时,就有可能导致内存占用问题.假设 某个 ...
- javascript 节点属性详解
javascript 节点属性详解 根据 DOM,html 文档中的每个成分都是一个节点 DOM 是这样规定的:整个文档是一个文档节点每个 html 标签是一个元素节点包含在于 html 元素中的文本 ...
- Javascript 查找字符串中出现最多的字符和出现的次数
<script type="text/javascript"> //查找字符串中出现最多的字符和出现的次数 var str = 'Thatwheneying its o ...
随机推荐
- PHP sin() 函数
实例 返回不同数的正弦: <?php高佣联盟 www.cgewang.comecho(sin(3) . "<br>");echo(sin(-3) . " ...
- Python语言及其应用 中文pdf完整版|网盘下载内附提取码
点击此处下载提取码:7cvm <Python语言及其应用>介绍Python 语言的基础知识及其在各个领域的具体应用,基于新版本3.x.书中首先介绍了Python 语言的一些基本知识,然后介 ...
- 2020牛客暑假多校训练营 第二场 G Greater and Greater bitset
LINK:Greater and Greater 确实没能想到做法. 考虑利用bitset解决问题. 做法是:逐位判断每一位是否合法 第一位 就是 bitset上所有大于\(b_1\)的位置 置为1. ...
- C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!
接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...
- luogu P2973 [USACO10HOL]Driving Out the Piggies G 驱逐猪猡
luogu LINK:驱逐猪猡 bzoj LINK:猪猪快跑 问题是在1时刻有个炸蛋在1号点 这个炸弹有p/q的概率爆炸 如果没有爆炸 那么会有1/di的概率选择一条边跳到另外一个点上重复这个过程. ...
- 执行HiveSQL出现的问题
-- ::, INFO [main] org.apache.hadoop.hive.ql.exec.ReduceSinkOperator: RECORDS_OUT_INTERMEDIATE:, -- ...
- kubernetes监控prometheus配置项解读
前言 文中解决两个问题: 1. kubernetes官方推荐的监控 prometheus 的配置文件, 各项是什么含义 2. 配置好面板之后, 如换去配置 grafana 面板 当然这两个问题网上都有 ...
- 比原链(Bytom)正式开源Bytom-JavaScript库
12月13日,比原链(Bytom)正式开源Bytom-JavaScript库,这个库是官方原生支持的新一代JavaScript SDK接口.JavaScript是世界上最多人使用的解释性脚本语言,JS ...
- 【LeetCode/LintCode 题解】约瑟夫问题 · Joseph Problem
n个人按顺序围成一圈(编号为1~n),从第1个人从1开始报数,报到k的人出列,相邻的下个人重新从1开始报数,报到k的人出列,重复这个过程,直到队伍中只有1个人为止,这就是约瑟夫问题.现在给定n和k,你 ...
- C# 使用代理实现线程间调用
实现功能: 后台线程改变窗体控件(flowLayoutPanel1)的状态. 利用 this.flowLayoutPanel1.InvokeRequired == false,可以知道是主线程调用的自 ...