文章目录
- 创建案例对象
- 对象属性的迭代有以下这几种方式:
- 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对象:
对象属性的迭代有以下这几种方式:
for-in
迭代对象可枚举的属性名,包括原型链上的属性
重点:
- 可枚举的属性
- 包括原型链上的属性
for (let key in self) {
console.log(key)
}
// name
// age
// gender
// constructor
原型链上的属性constructor
被打印出来
Object.Keys()
返回对象自身可枚举属性名组成的数组,不包括原型链上的属性
重点:
- 返回对象自身可枚举属性名组成的数组
- 不包括原型链上的属性
Ojbect.keys(self)
// ['name', 'age', 'gender']
Object.values()
返回对象自身可枚举属性值组成的数组,不包括原型链上的属性
重点:
- 返回对象自身可枚举属性值组成的数组
- 不包括原型链上的属性
Ojbect.values(self)
// ['self', 20, 'M']
Object.entries()
返回对象自身可枚举属性的键值对数组,不包括原型链上的属性
重点:
- 返回对象自身可枚举属的键值对数组
- 不包括原型链上的属性
Object.entries(self)
// [['name', 'self'], ['age', 20], ['gender', 'M']]
返回的是一个二维数组, 属性名在前,属性值在后
Object.getOwnPropertyNames()
返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组,不包括原型链上的属性
重点:
- 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性为名称的属性)组成的数组
- 不包括原型链上的属性
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
操作符来判断