欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JS获取对象属性名总结

程序员文章站 2022-03-01 20:05:09
最近面试遇到问如何获取对象全部属性名的方法,总结一下:对象属性类型分类:1.esmascript分类数据类型 又分为可枚举和不可枚举类型访问器类型 2.上下文分类原型属性实例属性 1.列举自身但不包括...

最近面试遇到问如何获取对象全部属性名的方法,总结一下:

对象属性类型分类:

1.esmascript分类

数据类型 又分为可枚举和不可枚举类型
访问器类型 

2.上下文分类

原型属性
实例属性 

1.列举自身但不包括原型的可枚举属性名 object.keys(obj)

  // 遍历对象
function person(name, age) {
  this.name = name;
  this.age = age;
}

person.prototype.demo = function() {};

let cj = new person('cj', 25);
// 通过object.defineproperty定义一个不可枚举属性
object.defineproperty(cj, 'weight', {
  enumerable:false 
})

// enumerable = true
// console.log(object.keys(cj)) // name age

// enumerable = false
// console.log(object.keys(cj)) // name age weight

2.列举包括自身不可枚举但不包括原型的属性名 object.getownpropertynames(obj)

function person(name, age) {
  this.name = name;
  this.age = age;
}
// 设置原型属性
person.prototype.demo = function() {};

let cj = new person('cj', 25);
// 通过object.defineproperty定义一个不可枚举属性
object.defineproperty(cj, 'weight', {
  enumerable:false 
})
// 获取属性名
console.log(object.getownpropertynames(cj)) // name age weight

3.获取自身和原型链上的可枚举属性 for in 返回的顺序可能与定义顺序不一致

function person(name, age) {
  this.name = name;
  this.age = age;
}
// 设置原型属性
person.prototype.demo = function() {};
object.prototype.j = 1
let cj = new person('cj', 25);
// 通过object.defineproperty定义一个不可枚举属性
object.defineproperty(cj, 'weight', {
  enumerable:false 
})

let props = []
for(prop in cj){
  props.push(prop)
}

console.log(props) //name age weight j

4.获取自身symbol属性 object.getownpropertysymbols(obj)

let obj = {};
// 为对象本身添加symbol属性名
let a = symbol("a");
obj[a] = "localsymbol";
// 为对象原型添加symbol属性名
let b = symbol("b")
object.prototype[b] = 111
let objectsymbols = object.getownpropertysymbols(obj);
console.log(objectsymbols); //symbol(a)

5.获取自身包括不可枚举和symbol属性名,但不包括原型 reflect.ownkeys(obj)

  // 遍历对象
function person(name, age) {
  this.name = name;
  this.age = age;
}

person.prototype.demo = function() {};
let s = symbol('s')
let cj = new person('cj', 25);
// 通过object.defineproperty定义一个不可枚举属性
object.defineproperty(cj, 'weight', {
  enumerable: false 
})
cj[s] = 1
let a = symbol('a')
object.prototype[a] = 1
console.log(object.getownpropertynames(cj)) //name age weight 
console.log(reflect.ownkeys(cj)) //name age weight symbol(s)

 更多关于js获取对象属性名的使用小技巧请查看下面的相关链接