Iwen's blog Iwen's blog
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • Linux
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
复盘
关于

Iwen

不摸鱼的哥哥
首页
  • 前端文章

    • JavaScript
    • Vue
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《TypeScript 从零实现 axios》
    • 小程序笔记
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • Linux
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
复盘
关于
  • Vue

  • Vue进阶

  • CSS

  • ES6

  • Base

  • Core

  • Array

  • Object

    • 浅拷贝与深拷贝
    • 方法总结
    • 可枚举、不可枚举的属性
      • 改变属性可枚举性
      • 遍历属性
        • Object.keys()
        • for in
        • hasOwnProperty()
        • JSON.stringify()
        • getOwnPropertyNames()
      • 自身+原型 所有属性
    • defineProperty
    • proxy
  • String

  • Async

  • Browser

  • Http

  • 性能优化

  • 正则

  • 经典总结

  • 设计模式

  • 数据结构

  • 算法

  • 手写

  • TypeScript

  • 复盘
  • Object
Mr.w
2020-11-29

可枚举、不可枚举的属性

# 可枚举、不可枚举的属性

在javascript中,对象的属性分为可枚举和不可枚举,他们是由property的enumerable值决定的。可枚举性决定了这个属性可否被for...in循环遍历到。

# 改变属性可枚举性

Object.defineProperty() (opens new window) 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

其中有一个属性enumerable,当且仅当该属性的enumerable键值为true时,该属性才会出现在对象的枚举属性中。默认为false

var Person = function (name) {
    this.name = name;
};

// 创建原型属性
Person.prototype.age = 26;

// 创建实例
var person = new Person('xiaog');

// 在person实例中创建不可枚举属性"job"
Object.defineProperty(person, 'job', {
    value: 'WEB',
    enumerable: false,
    configurable: true,
    writable: true,
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 遍历属性

# Object.keys()

只能返回自身可枚举属性

Object.keys(person); // ["name"]
1

# for in

自身/原型可枚举属性:返回自身可枚举属性和原型上的属性

for (var i in person) {
    console.log(i) // name age
}
1
2
3

# hasOwnProperty()

通过hasOwnProperty,我们过滤了那些从原型链上继承的可枚举属性,只保留了name这个自身可枚举属性。

和in运算符不同,该方法会忽略掉那些从原型链上继承到的属性。

for (i in person) {
    if (Object.hasOwnProperty(i)) {
        console.log(i); // "name"
    }
}
1
2
3
4
5

# JSON.stringify()

此方法也只能读取对象本身的可枚举属性,并序列化为JSON对象。

JSON.stringify(isaac)   // "{"name":"xiaog"}"
1

# getOwnPropertyNames()

返回可枚举与不可枚举的自身属性。

Object.getOwnPropertyNames(person) // ["name", "job"]
1

# 自身+原型 所有属性

那么如何获取自身属性和原型属性,包括可枚举和不可枚举的属性呢

// 获取所有属性方法封装
function getAllPropertyNames( obj ) {
  var props = [];

  do {
    Object.getOwnPropertyNames( obj ).forEach(function ( prop ) {
      if ( props.indexOf( prop ) === -1 ) {
          props.push( prop );
      }
    });
  } while ( obj = Object.getPrototypeOf( obj ) );

  return props;
}

function getAllPropertyNames( obj ) {
  var props = [];

  do {
      props= props.concat(Object.getOwnPropertyNames( obj ));
  } while ( obj = Object.getPrototypeOf( obj ) );

  return props;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
方法总结
defineProperty

← 方法总结 defineProperty→

最近更新
01
flex布局页面自适应滚动条问题
12-28
02
前后端分离开发请求接口跨域如何携带cookie的问题
12-28
03
怎么实现div长宽比固定width-height4比3
12-28
更多文章>
Theme by Vdoing | Copyright © 2017-2022 Iwen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式