Object.prototype.hasOwnProperty与Object.getOwnPropertyNames

Object.prototype.hasOwnProperty()

 

所有继承了 Object 的对象都会继承到 hasOwnProperty 方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。

使用 hasOwnProperty 方法判断属自身属性与继承属性

function Demo(name){this.name=name||'Tom';//自身属性
}
Demo.prototype.age='10';
var demo=new Demo('lilei');
              
//原型链的,非私有的属性
console.log(demo.hasOwnProperty('age'));//false
console.log(demo.hasOwnProperty('toString'));// 返回 false
//自身属性
console.log(demo.hasOwnProperty('name'));//true

  

使用 hasOwnProperty 作为属性名

JavaScript 并没有保护 hasOwnProperty 属性名,因此某个对象是有可能存在使用这个属性名的属性,使用外部的 hasOwnProperty 获得正确的结果是需要的:

var foo = {hasOwnProperty: function() {return false;},bar: 'Here be dragons'
};foo.hasOwnProperty('bar'); // 始终返回 false// 如果担心这种情况,可以直接使用原型链上真正的 hasOwnProperty 方法
({}).hasOwnProperty.call(foo, 'bar'); // true// 也可以使用 Object 原型上的 hasOwnProperty 属性
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

Object.getOwnPropertyNames()

Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。

 Object.getOwnPropertyNames() 返回一个数组,该数组对元素是 obj自身拥有的枚举或不可枚举属性名称字符串。 数组中枚举属性的顺序与通过 for...in 循环(或 Object.keys)迭代该对象属性时一致。数组中不可枚举属性的顺序未定义。

示例

var arr = ["a", "b", "c"];
console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"]// 类数组对象
var obj = { 0: "a", 1: "b", 2: "c"};
console.log(Object.getOwnPropertyNames(obj).sort()); // ["0", "1", "2"]// 使用Array.forEach输出属性名和属性值
Object.getOwnPropertyNames(obj).forEach(function(val, idx, array) {console.log(val + " -> " + obj[val]);
});
// 输出
// 0 -> a
// 1 -> b
// 2 -> c//不可枚举属性
var my_obj = Object.create({}, {getFoo: {value: function() { return this.foo; },enumerable: false}
});
my_obj.foo = 1;console.log(Object.getOwnPropertyNames(my_obj).sort()); // ["foo", "getFoo"]

  

如果你只要获取到可枚举属性,查看Object.keys或用for...in循环(还会获取到原型链上的可枚举属性,不过可以使用hasOwnProperty()方法过滤掉)。

 

下面的demo也是不会获取到原型链上的属性

function ParentClass() {}
ParentClass.prototype.inheritedMethod = function() {};function ChildClass() {this.prop = 5;this.method = function() {};
}ChildClass.prototype = new ParentClass;
ChildClass.prototype.prototypeMethod = function() {};console.log(Object.getOwnPropertyNames(new ChildClass()  // ["prop", "method"])
);

  

转载于:https://www.cnblogs.com/yiyi17/p/8446165.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IE9真的支持CSS3和HTML5?

微软昨天在其2009年专业开发者大会上展示 了下一个版本的Internet Explorer浏览器IE9。 尽管只是一个早期版本,IE开发团队还是比较高调的宣布了IE9的一些改 进,比如速度比之前的IE版本都更快些,缩小与FF和webkit之间的差距(也就是还是赶不上了…

绘图用计算机软件的基本种类有,主编教您电脑绘图软件有哪些

绘图软件是指专业人员根据一定准则设计的用于计算机绘图软件程序,种类非常多,通过它们可以满足足广大用户的基本绘图要求。下面,我就给大家介绍电脑绘图软件有哪些。电脑是根据指令进行高速计算的电子设备,功能强大,时…

python安装math库_Python-math库

导入函数import mathe#表示一个常量>>> math.e2.718281828459045exp#返回math.e,也就是2.71828的x次方exp(x)>>> math.exp(1)2.718281828459045>>> math.exp(2)7.38905609893065>>> math.exp(3)20.085536923187668pi#数字常量,…

使用Encog,ROME,JSoup和Google Guava进行博客分类

继续使用Programming Collection Intelligence (PCI),下一个练习是使用距离得分根据相关博客中使用的单词确定博客列表。 我已经找到Encog作为AI /机器学习算法的框架,为此,我需要一个RSS阅读器和一个HTML解析器。 我…

HTML浮动导致高度塌陷,HTML 文档流,设置元素浮动,导致父元素高度无法自适应的解决方法(高度欺骗)...

元素浮动定义float 属性定义元素在哪个方向浮动。以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动。浮动元素会生成一个块级框,而不论它本身是何种元素。如果浮动非替换元素,则要指定…

Python API简单验证

前言 因为CMDB内部的需求,需要一个API进行数据传输,用来传递需要抓取的服务端信息信息给抓取的autoclient,autoclient抓取好之后再通过API传输到服务器,保存到数据库。但是为了防止恶意的API访问,需要做一个验证。 设想…

完全CSS实现鼠标移上出现层的效果(超简单)

看过许多鼠标事件,都很复杂,太多的文件和繁杂的代码,而且好多都是用js实现,加载速度很慢。 这几天一直在找一种简单的实现效果,完全 CSS编写的效果,现在找到了,非常的少。 这就是完全 CSS实现的层效果&am…

搜索引擎学习日志

了解是什么:Google的咖啡因系统、Megastore云存储系统、Pregel云图计算模型、暗网爬取技术、Web2.0网页作弊、机器学习排序、情景搜索、社会化搜索 学习思想:先全局、再细节 《这就是搜索引擎:核心技术详解》page 33 / 315 开始第二章&#x…

前端微信签名验证工具_微信小程序API 用户数据的签名验证和加解密

用户数据的签名验证和加解密数据签名校验为了确保 开放接口 返回用户数据的安全性,微信会对明文数据进行签名。开发者可以根据业务需要对数据包进行签名校验,确保数据的完整性。签名校验算法涉及用户的session_key,通过 wx.login 登录流程获取…

会计电算化的过程 实质上是用计算机,会计电算化的过程,实质上是用计算机()的过程。A.单一地替代手工会计操作B.单一地替代对会计进行分...

会计电算化的过程,实质上是用计算机()的过程。A.单一地替代手工会计操作B.单一地替代对会计进行分更多相关问题以下对冷饮操作要求描述错误的是:()客舱网路的功用。()次高速减脂过程中一般每减多少做一个平台过渡()架线施工时弧垂…

Spring MVC控制器的单元测试:配置

传统上,为Spring MVC控制器编写单元测试既简单又成问题。 尽管编写调用控制器方法的单元测试非常简单,但问题是这些单元测试不够全面。 例如,我们不能仅通过调用已测试的控制器方法来测试控制器映射,验证和异常处理。 Spring MVC…

css实现鼠标覆盖显示大图

html <div <a href”#”> <img src”img01.jpg”> <img src”img02.jpg”> </a> </div> css img{border:none;} .pic{position:relative;top:10px;left:10px} .pic a .large{position:absolute;height:0;width:0;} .pic a:hover{di…

前端js编码

1、首先是encodeURI和encodeURIComponent&#xff1b; 从名字可以清晰的看出他两都是主要用于url编码的&#xff0c;那之间有什么区别呢&#xff1f;唯一区别就是编码的字符范围&#xff0c;其中 encodeURI方法不会对下列字符编码 ASCII字母、数字、~!#$&*():/,;?&#x…

common lisp的几个基本概念

S-表达式 quote nil 与 () cons car cdr 真假 predicate 谓词与 t 与 nil null 函数 与 not 函数 if then else and 与 or defun recursion 递归 谓词 eql 与 equal format 与 read&#xff1a;format 在函数体内调用不会输出 nil&#xff08;format 函数本身有返回值为 nil) l…

python循环结束执行后面代码_计算机程序中某种代码的反复执行,称为________。Python中的循环有重复一定次数的________,也有重复到某种情况结束的________。...

3.(2019高一下浙江期末)数制转换。将一个K进制(k<10)数x转换成十进制数可采用如下方法&#xff1a;主要方法是从右向左&#xff0c;依次取数x的各位数字&#xff0c;分别计算出该数从右边数起的第i位数字与k(i-1)的积&#xff0c;再将其累加&#xff0c;直到所有的数字取完为…

计算机流体力学软件基础及工程应用,流体力学及其工程应用(英文版·原书第10版)2013年版...

流体力学及其工程应用(英文版原书第10版)出版时间&#xff1a;2013年版内容简介《流体力学及其工程应用(英文版原书第10版)/时代教育国外高校优秀教材精选》继承并发扬了前9版讲述流体力学物理现象的传统&#xff0c;并以最简单而且尽可能是最清晰&#xff0c;但又不使用复杂数…

Spring MVC测试框架入门–第2部分

这个迷你系列的第一个博客介绍了Spring MVC测试框架&#xff0c;并展示了其在单元测试Spring MVC Controller类中作为控制器而不是POJO进行单元测试的用途。 现在是时候讨论使用框架进行集成测试了。 “集成测试”是指将Spring上下文加载到测试环境中&#xff0c;以便控制器可…

jira java接口生成问题

参考页面: 可方便扩展的JIRA Rest Web API的封装调用 JIRA是一个缺陷跟踪管理系统&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域,当我们需要把第三方业务系统集成进来时&#xff0c;可以调用他的API。 JIRA本身的A…

pmd 使用笔记

pmd是一块开源的代码静态分析工具&#xff0c;使用java编写&#xff0c;可以自定义规则来进行自己想要的分析。pmd可以单独使用&#xff0c;也可以作为idea、eclipse的插件使用。它的规则分为xpath规则&#xff0c;和java规则。https://pmd.github.io/ pmd内部工作机制比较简单…

css用一张大图片来设置背景的技术真相

之前就知道了用一张图片来设置页面内的所有背景的技术。原理很简单&#xff0c;利用background-potision精确地定位到图片的位置。好处是减少页面 的http请求数。 老实说&#xff0c;我并不觉得这个技术有多值得推广。虽然是减少了http请求数&#xff0c;但对于99%的网站来说&…