对象是否拥有某个属性,in和for in以及object.hasOwnProperty('×××')的异同,以及Object.defineProperty(),Object.keys(),Object.getOwnPropertyNames()的用法
1.在某个对象是否拥有某个属性,判断的方法有很多,常用的方法就是object.hasOwnProperty('×××'),这个方法是不包括对象原型链上的方法的,举个例子:
var obj = {
name:'fei'
}
console.log(obj.hasOwnProperty('name'))//true
console.log(obj.hasOwnProperty('toString'))//false
在这个例子中,obj对象存在的name属性的时候,调用这个方法才是返回true,我们知道其实每个对象实例的原型链上存在toString方法,在这里打印false,说明这个方法只是表明实例对象的属性,不包括原型链上的属性。
2.下面我们再来看看in的使用,例子如下:
var obj = {
name:'fei'
}
console.log('toString' in obj)//true
我们可以看到,其实在这个例子中,我只是给了对象一个属性name,并没有其他的属性,然后我执行'tiString' in obj,可以看出控制动态打印出来的是true,原因就是对象的原型链上存在toString方法,所以in操作不管是不是原型链上,只要存在这个属性,返回的就是true。
3.接着我们再看for in。在使用for in 循环的时候,其实返回的是能通过对象访问的,可枚举的,包括实例中的,也包括原型中的,例子如下
var obj = {
name:'fei',
age:20,
friend:["fei","jun","zhu"]
}
for( var i in obj){
console.log(i)//会打印三次,name,age,friend
}
为什么上面没有打印原型中的属性呢,因为原型中的属性都默认设置了不可枚举(enumerated);我们将例子改成下面这样:
var obj = {
name:'fei',
age:20,
friend:["fei","jun","zhu"]
}
Object.defineProperty(obj, 'like', {//使用Object.defineProperty()方法可以设置你设置属性的特性
enumerable:false,//设置不可枚举
value:'basketball'//值为basketball
})
console.log(obj)//Object {name: "fei", age: 20, friend: Array[3], like: "basketball"}
for(var i in obj){
console.log(i)//依旧打印三个name,age,friend
}
从这个例子中可以看出,在给属性设置为不可枚举的时候,是不会出现在for in循环中的,这也造成IE低版本出现bug,就是不可枚举的属性不会出现在for in中,如果你从新定义了一个属性和原型的属性相同,那么这个属性也不会出现在for in中,现在的浏览器不会出现,例子如下:
var obj = {
toString:function(){
return "666"
}
}
for(var i in obj){
if(i=="toString"){
console.log('我出现了') //在低版本的IE中不显示
}
}
4.要取得所有可枚举的对象,可以使用ECMAscript5的方法Object.keys(),接受一个对象为参数,返回所有可枚举的属性的字符串数组:
function People(){
}
People.prototype.say = function(){
console.log('say')
}
People.prototype.name = "feifei";
var people = new People()
people.age = 12;
console.log(Object.keys(people))//['age']
这个方法并不会包含原型链中的属性,只是实例中的可枚举的属性。
5.获取实例中所有属性,无论是否可枚举,利用Object.getOwnPropertyNames(),以对象为参数,返回熟悉的数组。例子:
function People(){
}
People.prototype.say = function(){
console.log('say')
}
People.prototype.name = "feifei";
var people = new People()
people.age = 12;
Object.defineProperty(people, 'like', {//使用Object.defineProperty()方法可以设置你设置属性的特性
enumerable:false,//设置不可枚举
value:'basketball'//值为basketball
})
console.log(people)//People {age: 12, like: "basketball"}
console.log(Object.getOwnPropertyNames(people))//["age", "like"]
这个方法仅仅是返回实例中所有的属性,无论是不是可枚举的,不包括原型里面的属性。
对象是否拥有某个属性,in和for in以及object.hasOwnProperty('×××')的异同,以及Object.defineProperty(),Object.keys(),Object.getOwnPropertyNames()的用法的更多相关文章
- 判断JS对象是否拥有某属性的方法举例
判断JS对象是否拥有某属性 JS是否拥有某属性的判断方法,这里提供两种方式,供大家参考. 1.in 运算符 var obj = {name:'jack'}; alert('name' in obj); ...
- Reflect.has检测对象是否拥有某个属性
Reflect.has({x: 0}, 'x'); // true Reflect.has({x: 0}, 'y'); // false // returns true for properties ...
- 判断JS对象是否拥有某属性
两种方式,但稍有区别 1.in 运算符
- jQuery基础(样式篇,DOM对象,选择器,属性样式)
1. $(document).ready 的作用是等页面的文档(document)中的节点都加载完毕后,再执行后续的代码,因为我们在执行代码的时候,可能会依赖页面的某一个元素,我们要确保这个元素真 ...
- 判断js对象是否拥有某一个属性的js代码
js对象是否拥有某一个属性的判断方法有很多. 本文分享一个简单的方法,如下: <script> /** * 判断js对象是否具有某属性 * by www.jbxue.com */ var ...
- oc之对象作为类的属性
对象做为类的属性 1. 一个Target中的类无法直接在另外1个Target中访问. 2. 类的属性代表什么? a. 类的属性代表这类事物具有的共同的特征 b. 类的属性代表这个类所拥有的东西. 灯: ...
- 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...
- JavaScript 秘密花园——对象的使用和属性操作
JavaScript 中所有变量都是对象,除了两个例外 null 和 undefined. false.toString(); // 'false' [1, 2, 3].toString(); // ...
- Three---面向对象与面向过程/属性和变量/关于self/一些魔法方法的使用/继承/super方法/多态
python的面向对象 面向对象与面向过程 面向过程 面向过程思想:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为,需要自己编写代码(自己来做) 面向对象 面向对象的三 ...
随机推荐
- ACE_Select_Reactor_T 介绍 (2)
本章目录 ACE_Select_Reactor_T 介绍 类继承图 类协作图 类主要成员变量 事件处理函数调用图 事件处理主流程 handle_events 函数流程 handle_events_i ...
- 使用pyinstaller将Python打包为exe文件
当我们完成一个Python项目或一个程序时,希望将Python的py文件打包成在Windows系统下直接可以运行的exe程序,那么pyInstaller就是一个很好的选择.pyInstaller可以将 ...
- Assetbundle1
AssetBundle运行时加载:来自文件就用CreateFromFile(注意这种方法只能用于standalone程序)这是最快的加载方法也可以来自Memory,用CreateFromMemory( ...
- Java IO学习--输入输出流
一.Java IO的定义 I/O:输入输出系统,由输入输出控制系统和外围设备两部分组成. Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输 ...
- (原) MatEditor部- UmateriaEditor中Texture使用过程(1)
@author: 白袍小道 转载说明原处 插件同步在GITHUB: DaoZhang_XDZ 最后YY需求(手滑)(开黑前弄下,充数,见谅) 1.在理清楚基础套路和细节后,自定义纹理资源,并加 ...
- P3950部落冲突
题面 \(Solution:\) 法一:LCT裸题 又好想又好码,只不过常数太大. 法二:树链剖分 每次断边将该边权的值++,连边--,然后边权化点权(给儿子),询问就查询从x到y的路径上的边权和,树 ...
- 深度可分卷积(Depthwise Separable Conv.)计算量分析
上次读到深度可分卷积还是去年暑假,各种细节都有些忘了.记录一下,特别是计算量的分析过程. 1. 标准卷积和深度可分卷积 标准卷积(MobileNet论文中称为Standard Convolution, ...
- 树莓派搭建 Hexo 博客(一)
Hexo 一个开源的博客框架,本文记录了一下在树莓派上搭建 Hexo 博客的过程. 什么是 Hexo? Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解 ...
- linux备忘录-shell脚本
知识 shell执行方式 shell执行方式有 通过source或. 在现在的bash环境中执行脚本 变量等会保持 通过bash shell.sh或sh shell.sh 使用一个新的bash环境执行 ...
- BZOJ 2756 SCOI2012 奇怪的游戏 最大流
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2756 Description Blinker最近喜欢上一个奇怪的游戏. 这个游戏在一个 N ...