js 对象中属性的来源
通过对对象的创建,继承的理解,我们可以发现,在平时使用时,prototype和实例中的属性都可以直接通过this.para来调用。而且优先使用实例中的属性,然后在根据原型链一步步的向上寻找属性的位置,直到找到为止。在平时,这些机制对于我们使用对象有很大帮助,但是有时候会产生实例属性覆盖原型属性,使我们调用不到正确的值。这时候我们就首先要判断我们现在能得到的属性来自于哪个位置。
首先是in操作符,in操作符可以判断某个属性在对象中能否被访问,不管是在实例中还是原型中。看以下这个例子:
1 function Myobj(){ 2 this.name='Tom'; 3 this.age='20'; 4 } 5 Myobj.prototype.getName = function(){ 6 console.log(this.name); 7 } 8 var obj = new Myobj(); 9 console.log('name' in obj); 10 console.log('getName' in obj);
最后两个console.log返回的都是true,这样就有了可以确定某个属性是否在这个对象中了。
接下来就是hasOwnProperty了,它可以判断某个属性是来自实例中还是原型中。对于在实例中的属性会返回true,而在原型中的属性会返回false,看下面这个例子:
1 function Myobj(){ 2 } 3 Myobj.prototype.name = 'Peter'; 4 Myobj.prototype.getName = function(){ 5 console.log(this.name); 6 } 7 var obj = new Myobj(); 8 console.log(obj.hasOwnProperty('name')); //false 9 obj.name = 'Tom'; 10 console.log(obj.hasOwnProperty('name')); //true 11 delete obj.name; 12 console.log(obj.hasOwnProperty('name')); //false
通过hasOwnProperty方法的使用,我们可以清楚的知道我们访问的到底是实例属性,还是来自原型或原型链中的属性。在调用obj.hasOwnProperty('name')时,只有重写name属性,才能使name成为一个实例属性,那么才会返回true。delete删除了这个name实例属性后,hasOwnProperty又会返回false了。
根据以上的这些函数的特性,我们可以编写一个函数来检测属性是否来自于原型:
1 function isParaFromProto(obj,para){ 2 if(para in obj){ 3 return (!obj.hasOwnProperty(para))?true:false; 4 }else{ 5 throw new Error('para not in obj'); 6 } 7 }
函数的使用如下:
1 function Myobj(){ 2 } 3 Myobj.prototype.name = 'Peter'; 4 Myobj.prototype.getName = function(){ 5 console.log(this.name); 6 } 7 var obj = new Myobj(); 8 console.log(isParaFromProto(obj,'name')); //true 9 obj.name = 'Tom'; 10 console.log(isParaFromProto(obj,'name')); //false 11 delete obj.name; 12 console.log(isParaFromProto(obj,'name')); //true
关于in操作符
in操作符主要有两个用处,一个是以上介绍过的,另一个是用在for语句中。但是两处地方在一些设置更改以后还是有不同的地方。Object中定义有defineProperty方法,它可以设置对象中属性的特性(不能设置原型中的属性),通过将Enumerable属性设置为false,那么for in循环就无法遍历到这个属性了,就想object中原生的__proto__属性。但是这时用in操作符判断属性是否在对象中时,还是可以返回true的。
1 function Myobj(){ 2 this.name = 'Tom'; 3 } 4 var obj = new Myobj(),arr = []; 5 for(var i in obj){ 6 arr.push(i); 7 } 8 console.log(arr); //['name'] 9 console.log('name' in obj); //true 10 arr=[]; 11 Object.defineProperty(obj,'name',{enumerable:false}); 12 for(var i in obj){ 13 arr.push(i); 14 } 15 console.log(arr); //[] 16 console.log('name' in obj); //true
转载于:https://www.cnblogs.com/cyITtech/p/3564189.html
js 对象中属性的来源相关推荐
- js 对象中添加新属性
js 对象中添加新属性 对象数组添加新属性 同名属性会被覆盖,相同属性会去重
- js 对象中,可枚举性(enumerable)是什么?
js 对象中,可枚举性(enumerable)是什么? 可枚举性(enumerable)用来控制所描述的属性,是否将被包括在 for-in 循环之中(除非属性名是一个 Symbol).具体来说,如果一 ...
- 遍历和添加json对象的属性 和 遍历普通js对象的属性
1. 遍历 json 对象的属性 //定义json对象 var person= { name: 'zhangsan', pass: '123', fn: function(){ alert(this. ...
- 这样写,才可以让JS对象中的key包含短横杠-
这样写,才可以让JS对象中的key包含短横杠- 在定义对象时,如果直接将包含短横杠-的字符串作为对象的key,JS会报错: const o = {v-red: 1 // 报错 SyntaxError: ...
- JS对象中常见的方法
本文主要介绍Native对象,即在ECMAScript标准中定义和描述,包括JavaScript内置对象(数组,日期对象等)和用户自定义的对象 目录 1. 对象的创建并添加属性 1. new 对象 2 ...
- [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)...
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 使用变量的值作为JS对象的属性名,从而获取其对应的值
使用变量的值作为JS对象的属性名,从而获取其对应的值 <script>var object={"a":1111,"b":2222};var para ...
- 如何获取数组中嵌套对象中属性值不为空的对象?
如何获取数组中嵌套对象中属性值不为空的对象? 有一个对象数组如下: let arr = [ {id:1,aa:'aa1'}, {id:2,aa:'aa2',bb:{ cc:{dd:12} }}, {i ...
- 判断对象中属性值是否全为空
import java.lang.reflect.Field; /*** 判断对象中属性值是否全为空** @param object* @return*/public static boolean c ...
- JS对象中的属性类型、属性定义和属性读取
理解对象 ES5中的对象是指无序的属性的集合.(属性可以是基本值.对象和函数). 对象的属性类型有两种,一种是数据属性,是数据值的保存位置:另一种是访问器属性,包含getter和setter函数. 1 ...
最新文章
- Java学习之注解Annotation实现原理
- java库加载,Java:使用依赖项加载共享库
- python教程怎么抓起数据_介绍python 数据抓取三种方法
- mysql数据备份mysqldump
- 如何使用QuickConnect远程访问Synology NAS
- 基于深度学习的磁环表面缺陷检测算法
- webdrive不更新_关于selenium 用Webdrive打开Firefox不含有插件的问题(python)
- 加个ing是什么意思_英语中动词ed和ing形式作形容词时用法有啥区别,牢记以下要点!...
- 步道乐跑怎么刷公里_车子一年跑不到5000公里,怎么保养比较好?这些方法最省钱...
- 不为人知的Nothing和Is
- 在word里批量插入由文件创建对象,word宏定义批量插入对象
- 什么是私域运营、怎么做私域运营?
- oracle设计案例,Oracle课程设计案例精编
- MySQL学习---作业(1)
- jQuery fadeIn淡入效果
- wifi辐射知多少【解疑答惑篇】
- 执行repo init提示error.GitError: manifests ls-remote解决方案
- 电商网站的价格大概多少钱?
- linux I2C 驱动
- IDEA文档注释(教程+模板)
热门文章
- 计算机网络第三版周舸答案,计算机网络技术基础第3版周舸第一章节计算机网络基础知识课件教学.ppt...
- java 分布式同步锁_java编程进阶之路:回归锁的本质,探索分布式锁之源头
- mysql面试题 真的很不错
- 怎样呵护友谊_我不善于经营友情,有好的开始却没有好的友谊,怎样建设友情呢?...
- Get请求参数中文乱码问题整理
- STL vector的迭代器的熟练运用及lower_bound和upper_bound的使用
- 每日一技|巧用 Telnet 调试 Dubbo 服务
- PHP PDO 封装 成静态类
- 【深度学习系列】PaddlePaddle可视化之VisualDL
- 第一周例行报告及作业汇总