通过对对象的创建,继承的理解,我们可以发现,在平时使用时,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 对象中属性的来源相关推荐

  1. js 对象中添加新属性

    js 对象中添加新属性 对象数组添加新属性 同名属性会被覆盖,相同属性会去重

  2. js 对象中,可枚举性(enumerable)是什么?

    js 对象中,可枚举性(enumerable)是什么? 可枚举性(enumerable)用来控制所描述的属性,是否将被包括在 for-in 循环之中(除非属性名是一个 Symbol).具体来说,如果一 ...

  3. 遍历和添加json对象的属性 和 遍历普通js对象的属性

    1. 遍历 json 对象的属性 //定义json对象 var person= { name: 'zhangsan', pass: '123', fn: function(){ alert(this. ...

  4. 这样写,才可以让JS对象中的key包含短横杠-

    这样写,才可以让JS对象中的key包含短横杠- 在定义对象时,如果直接将包含短横杠-的字符串作为对象的key,JS会报错: const o = {v-red: 1 // 报错 SyntaxError: ...

  5. JS对象中常见的方法

    本文主要介绍Native对象,即在ECMAScript标准中定义和描述,包括JavaScript内置对象(数组,日期对象等)和用户自定义的对象 目录 1. 对象的创建并添加属性 1. new 对象 2 ...

  6. [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)...

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  7. 使用变量的值作为JS对象的属性名,从而获取其对应的值

    使用变量的值作为JS对象的属性名,从而获取其对应的值 <script>var object={"a":1111,"b":2222};var para ...

  8. 如何获取数组中嵌套对象中属性值不为空的对象?

    如何获取数组中嵌套对象中属性值不为空的对象? 有一个对象数组如下: let arr = [ {id:1,aa:'aa1'}, {id:2,aa:'aa2',bb:{ cc:{dd:12} }}, {i ...

  9. 判断对象中属性值是否全为空

    import java.lang.reflect.Field; /*** 判断对象中属性值是否全为空** @param object* @return*/public static boolean c ...

  10. JS对象中的属性类型、属性定义和属性读取

    理解对象 ES5中的对象是指无序的属性的集合.(属性可以是基本值.对象和函数). 对象的属性类型有两种,一种是数据属性,是数据值的保存位置:另一种是访问器属性,包含getter和setter函数. 1 ...

最新文章

  1. Java学习之注解Annotation实现原理
  2. java库加载,Java:使用依赖项加载共享库
  3. python教程怎么抓起数据_介绍python 数据抓取三种方法
  4. mysql数据备份mysqldump
  5. 如何使用QuickConnect远程访问Synology NAS
  6. 基于深度学习的磁环表面缺陷检测算法
  7. webdrive不更新_关于selenium 用Webdrive打开Firefox不含有插件的问题(python)
  8. 加个ing是什么意思_英语中动词ed和ing形式作形容词时用法有啥区别,牢记以下要点!...
  9. 步道乐跑怎么刷公里_车子一年跑不到5000公里,怎么保养比较好?这些方法最省钱...
  10. 不为人知的Nothing和Is
  11. 在word里批量插入由文件创建对象,word宏定义批量插入对象
  12. 什么是私域运营、怎么做私域运营?
  13. oracle设计案例,Oracle课程设计案例精编
  14. MySQL学习---作业(1)
  15. jQuery fadeIn淡入效果
  16. wifi辐射知多少【解疑答惑篇】
  17. 执行repo init提示error.GitError: manifests ls-remote解决方案
  18. 电商网站的价格大概多少钱?
  19. linux I2C 驱动
  20. IDEA文档注释(教程+模板)

热门文章

  1. 计算机网络第三版周舸答案,计算机网络技术基础第3版周舸第一章节计算机网络基础知识课件教学.ppt...
  2. java 分布式同步锁_java编程进阶之路:回归锁的本质,探索分布式锁之源头
  3. mysql面试题 真的很不错
  4. 怎样呵护友谊_我不善于经营友情,有好的开始却没有好的友谊,怎样建设友情呢?...
  5. Get请求参数中文乱码问题整理
  6. STL vector的迭代器的熟练运用及lower_bound和upper_bound的使用
  7. 每日一技|巧用 Telnet 调试 Dubbo 服务
  8. PHP PDO 封装 成静态类
  9. 【深度学习系列】PaddlePaddle可视化之VisualDL
  10. 第一周例行报告及作业汇总