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()的用法的更多相关文章

  1. 判断JS对象是否拥有某属性的方法举例

    判断JS对象是否拥有某属性 JS是否拥有某属性的判断方法,这里提供两种方式,供大家参考. 1.in 运算符 var obj = {name:'jack'}; alert('name' in obj); ...

  2. Reflect.has检测对象是否拥有某个属性

    Reflect.has({x: 0}, 'x'); // true Reflect.has({x: 0}, 'y'); // false // returns true for properties ...

  3. 判断JS对象是否拥有某属性

    两种方式,但稍有区别 1.in 运算符  

  4. jQuery基础(样式篇,DOM对象,选择器,属性样式)

      1. $(document).ready 的作用是等页面的文档(document)中的节点都加载完毕后,再执行后续的代码,因为我们在执行代码的时候,可能会依赖页面的某一个元素,我们要确保这个元素真 ...

  5. 判断js对象是否拥有某一个属性的js代码

    js对象是否拥有某一个属性的判断方法有很多. 本文分享一个简单的方法,如下: <script> /** * 判断js对象是否具有某属性 * by www.jbxue.com */ var ...

  6. oc之对象作为类的属性

    对象做为类的属性 1. 一个Target中的类无法直接在另外1个Target中访问. 2. 类的属性代表什么? a. 类的属性代表这类事物具有的共同的特征 b. 类的属性代表这个类所拥有的东西. 灯: ...

  7. 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法

    1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...

  8. JavaScript 秘密花园——对象的使用和属性操作

    JavaScript 中所有变量都是对象,除了两个例外 null 和 undefined. false.toString(); // 'false' [1, 2, 3].toString(); // ...

  9. Three---面向对象与面向过程/属性和变量/关于self/一些魔法方法的使用/继承/super方法/多态

    python的面向对象 面向对象与面向过程 面向过程 面向过程思想:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为,需要自己编写代码(自己来做) 面向对象 面向对象的三 ...

随机推荐

  1. fastlane自动化打包ipa并发布到firim或者蒲公英

    1.打开终端,确保Xcode Command Line Tools 安装了最新版 xcode-select --install 2.安装fastlane sudo gem install -n /us ...

  2. 「赛后补题」HBCPC2018题目代码与思路简析

    这次比赛(2018年第二届河北省大学生程序设计竞赛)虽然没有打,但是题目还是要写的.未完成的题目(还差比较硬核的四题)和思路分析会陆续更新完. Problem A 2011 Mex Query /* ...

  3. Qt Qwdget 汽车仪表知识点拆解7 图像绘制,旋转

    先贴上效果图,注意,没有写逻辑,都是乱动的 看下最中心的指针旋转,这里使用的QPainter的绘制函数 要显示复杂的效果,需要分层 void Widget::draw_number_pointer() ...

  4. pta函数作业

    7-10 设计思路:本题需要判断一个正整数数是否为素数,所谓素数,就是除一和本身外没有其他因数的数.具体判断过程如下:对于一个大于一的整数,从2开始用循环计数i去除此数,若余数不为零,则循环计数i自加 ...

  5. PAT 1055 集体照

    https://pintia.cn/problem-sets/994805260223102976/problems/994805272021680128 拍集体照时队形很重要,这里对给定的 N 个人 ...

  6. PAT 1087 有多少不同的值

    https://pintia.cn/problem-sets/994805260223102976/problems/1038429191091781632 当自然数 n 依次取 1.2.3.…….N ...

  7. PAT 甲级 1002 A+B for Polynomials

    https://pintia.cn/problem-sets/994805342720868352/problems/994805526272000000 This time, you are sup ...

  8. 搭建Lepus数据库监控系统

    一.  安装环境 系统环境:centos6.5 IP:192.168.30.242 hostname:vpn.org 软件:LAMP均已安装.(请确保这些正常安装,并能使用). 系统核心包:(摘自官方 ...

  9. BZOJ2257 [Jsoi2009]瓶子和燃料 【裴蜀定理】

    题目链接 BZOJ2257 题解 由裴蜀定理我们知道,若干的瓶子如此倾倒最小能凑出的是其\(gcd\) 现在我们需要求出\(n\)个瓶子中选出\(K\)个使\(gcd\)最大 每个数求出因数排序即可 ...

  10. 洛谷 P2827 蚯蚓 解题报告

    P2827 蚯蚓 题目描述 本题中,我们将用符号 \(\lfloor c \rfloor\) 表示对 \(c\) 向下取整,例如:\(\lfloor 3.0 \rfloor = \lfloor 3.1 ...