一、定义对象
function Parent(name, age) {
this.name = name
this.age = age
}
function Child(school) {
// Parent.call(this)
this.school = school
this[Symbol('symbol')] = 'symbol'
}
Child.prototype = new Parent()
Child.prototype.constructor = Child
let xiaoming = new Child('晨卿小学')
Object.defineProperties(xiaoming, {
'property1': {
value: 'IM_property1',
enumerable: true,
configurable: true,
writable: true
},
'property2': {
value: 'IM_property2',
enumerable: false,
configurable: true,
writable: true
},
})
定义了一个实例对象xiaoming,在这个实例对象上面:
- 可枚举属性:school、property1
- 不可枚举属性:property2
- Symbol属性:Symbol('symbol')
- 继承属性:name、age、constructor(即,prototype上的属性)
二、遍历方法
1、for ... in ...:枚举出自身的可枚举属性和继承属性
结果:name、age、school、property1、constructor(继承的原因,把constructor枚举出来了)
2、Object.keys():枚举出自身的可枚举属性,返回一个数组
结果:['school', 'property1']
3、Object.getOwnPropertyNames():枚举出自身的可枚举属性和不可枚举属性,返回一个数组
结果:['school', 'property1', 'property2']
4、Object.getOwnPropertySymbols():枚举出Symbol
结果:[Symbol(symbol)]
5、Reflect.ownKeys():枚举出自身的可枚举属性、不可枚举属性和Symbol
结果:['school', 'property1', 'property2', Symbol(symbol)]
方法 | 可枚举属性 | 不可枚举属性 | Symbol | 继承属性 |
for ... in ... | √ | √ | ||
Object.keys() | √ | |||
Object.getOwnPropertyNames | √ | √ | ||
Object.getOwnPropertySymbols() | √ | |||
Reflect.ownKeys() | √ | √ | √ |