关于Object属性的一些理解

平时在业务写需求的时候总是会涉及到获取对象属性的需求。比如你可以像下面这么做:

    const obj = {
      prototype1: 1,
      prototype2: null,
      prototype3: 3
    }
    for (let key in obj) {
      console.log(key) // 'prototype1' 'prototype2' 'prototype3'
    }
  • hasOwnProperty
    但是如果你以为这样就万事大吉就错了,因为for in还可以查找遍历原型链上的属性,从而达到和你错误的预期。比如以下:
    Object.prototype.prototype4 = 4
    const obj = {
      prototype1: 1,
      prototype2: null,
      prototype3: 3
    }
    for (let key in obj) {
      console.log(key) // 'prototype1' 'prototype2' 'prototype3' 'prototype4'
    }

所以我们用for in遍历对象的属性的时候需要过滤掉来自于原型链上的属性,hasOwnProperty方法接受一个字符串或者symbol用来返回对象上是否存在该属性,且该方法只会检测自身属性。所以代码可以作如下改造:

    Object.prototype.prototype4 = 4
    const obj = {
      prototype1: 1,
      prototype2: null,
      prototype3: 3
    }
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        console.log(key) // 'prototype1' 'prototype2' 'prototype3'
      }
    }

但是如果你以为这样就安全就太年轻了,因为hasOwnProperty作为对象的一个属性来讲是可以被重写的,所以我们最好不要直接用对象自身的hasOwnProperty,而是如下:

    Object.prototype.prototype4 = 4
    const obj = {
      prototype1: 1,
      prototype2: null,
      prototype3: 3
    }
    for (let key in obj) {
      if (Object.hasOwnProperty.call(obj, key)) {
        console.log(key)
      }
    }
  • enumerable
    其实每个对象上面都会有很多属性,比如上面的hasOwnProperty也是对象的一个属性,那么为什么这些属性for in遍历不到呢?因为有些属性是不可枚举的,也就是说该属性的描述符enumerable为false,我们可以打印一下obj的一个属性来看一下该属性的描述符:
console.log(Object.getOwnPropertyDescriptor(obj, 'prototype1'))

我们可以看到打印了一个对象,其中enumerable为true。其实我们也可以设置对象的属性为不可枚举,然后在用for in看是否可以遍历的到:

    Object.prototype.prototype4 = 4
    const obj = {
      prototype1: 1,
      prototype2: null,
      prototype3: 3
    }
    Object.defineProperty(obj, 'prototype1', {
      enumerable: false
    })
    for (let key in obj) {
      if (Object.hasOwnProperty.call(obj, key)) {
        console.log(key)  // 'prototype2' 'prototype3'
      }
    }

这里我们使用defineProperty去设置对象的属性的属性描述符,该方法第一个参数为对象,第二个参数为对象的属性,第三个参数为属性描述符。我们看到了prototype1没有被遍历到。

  • configurable value writable
    作为对象属性的属性描述符除了enumerable代表是否可枚举之外,还有configurable value writable这三个描述符,其中value很好理解,就是属性对应的值。configurable描述符为true的时候代表该属性可以被删除,writable为true代表可以修改该属性的value。
  • 结论
    我们获取对象属性的时候,最好使用Object.keys()方法。该方法会直接返回对象自身的所有可枚举属性的字符串数组。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 美奈 醒来时,天空已是一片湛蓝。海面上停泊的渔船,纷纷使出港口,驶向远海。海风拂过椰树林,树叶随风飘扬。海浪依旧...
    戚静秋阅读 495评论 9 4
  • 大年初二给亲朋拜年时顺路把苹果苗拉了回来 年初三就种了下去 加上堆了几个月的菌棒和浸泡好的生物碳,坐等后年吃上红富...
    藏石文化阅读 314评论 0 0
  • 要说隐喻,数千年来的斗争、合作、斗争、合作……屡屡重复上演,斗争是常规生存的法则,合作是困境来临,弥补各自不足的选...
    orwill阅读 545评论 1 3
  • 仙人觉得应该是这样的!如果不是,那算不上好照片!至少能领你静止了!
    纵情嬉戏天地间阅读 221评论 0 0
  • 今天是国培学习的第四天,上午听的是专家报告,下午到合肥八中参观学习。 合肥八中可是省重点高中,带着快乐的心情,带...
    涓涓浅语阅读 408评论 0 2