文章目录

  • 创建案例对象
  • 对象属性的迭代有以下这几种方式:
  • for-in
  • Object.Keys()
  • Object.values()
  • Object.entries()
  • Object.getOwnPropertyNames()
  • 最后再说一下`in`操作符


创建案例对象

先通过继承来创建对象:

function Parent (name, age) {
	this.name = name || 'parent'
    this.age = age || 60
}
function Self (name, age, gender) {
    Parent.call(this, name, age)
    this.gender = gender
}
Self.prototype = new Parent()
Self.prototype.constructor = Self

let self = new Self('self', 20, 'M')

// 设置不可枚举属性birthDate
Object.defineProperty(self, 'birthDate', {
	configurable: true,
    enumerable: false,
    writable: true,
    value: '2019-01-16'
})

在控制台输出self对象:

java 迭代对象本身属性_in

对象属性的迭代有以下这几种方式:

for-in

迭代对象可枚举的属性名,包括原型链上的属性

重点:

  1. 可枚举的属性
  2. 包括原型链上的属性
for (let key in self) {
    console.log(key)
}
// name
// age
// gender
// constructor

原型链上的属性constructor被打印出来

Object.Keys()

返回对象自身可枚举属性名组成的数组,不包括原型链上的属性

重点:

  1. 返回对象自身可枚举属性名组成的数组
  2. 不包括原型链上的属性
Ojbect.keys(self)
// ['name', 'age', 'gender']

Object.values()

返回对象自身可枚举属性值组成的数组,不包括原型链上的属性

重点:

  1. 返回对象自身可枚举属性值组成的数组
  2. 不包括原型链上的属性
Ojbect.values(self)
// ['self', 20, 'M']

Object.entries()

返回对象自身可枚举属性的键值对数组,不包括原型链上的属性

重点:

  1. 返回对象自身可枚举属的键值对数组
  2. 不包括原型链上的属性
Object.entries(self)
// [['name', 'self'], ['age', 20], ['gender', 'M']]

返回的是一个二维数组, 属性名在前,属性值在后

Object.getOwnPropertyNames()

返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组,不包括原型链上的属性

重点:

  1. 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性为名称的属性)组成的数组
  2. 不包括原型链上的属性
Object.getOwnPropertyNames(self)
// ['name', 'age', 'gender', 'brithDate']

不可枚举属性名birthDate被打印出来了

最后再说一下in操作符

判断给定属性是否属于对象属性,不管该属性存在于实例还是原型中

'name' in self // true
'age' in self // true
'gender' in self // true
'birthDate' in self // true
'constructor' in self // true
'valueOf' in self // true

可以确定是,所有的属性(包括原型链上)都可通过in操作符来判断