创建对象的几种方式
对象属性的特征(特性)
对象属性的特性主要有两种,数据属性和访问器属性
数据属性
- [[Configurable]]:默认为true,该属性是否可被delete后重新定义
- [[Enumerable]]:默认为true,该属性是否可使用for-in遍历到
- [[Wirtable]]:默认为true,该属性值是否可写
- [[Value]]:属性值,默认为undefine
要修改数据属性,必须使用
Object.defineProperty()
方法,该方法有如下三个参数:
- 属性所在的对象
- 属性名
- 描述符对象:该对象的属性必须是configurable、enumerable、wirtable或者value
let person = {} Object.defineProperty(person, 'name', { writable: false, value: 'John' }) console.log(person.name) // John person.name = 'ZhangSan' console.log(person.name) // John
注意,在使用
Object.defineProperty
将configurable改为false之后,就不能再将它改为true了
访问器属性
- [[Configurable]]:默认为true,该属性是否可被delete后重新定义
- [[Enumerable]]:默认为true,该属性是否可使用for-in遍历到
- [[Get]]:默认为undefine,读取属性时调用的方法
- [[Set]]:默认为undefine,设置属性值时调用的方法
访问器属性不能直接定义,要使用 `Object.defineProperty()来定义
let person = { name: 'John' } Object.defineProperty(person, 'name', { get: function() { return this.name } set: function(newValue) { this.name = newValue } })
访问多个属性的特性值 Object.defineProperties
在Object.defineProperty()
的基础上,Object.defineProperties()
,从名字可以看出来,通过这个方法,我们可以通过描述符一次定义多个属性
let person = {}
Object.defineProperties(person, {
name: {
value: 'John',
wirtable: false
},
age: {
value: 20,
get() {
return this.value
}
}
})
读取属性特征值 Object.getOwnPropertyDescriptor
Object.getOwnPropertyDescriptor()
这个方法可以获取对象属性的特征值,有两个参数
- 属性所在的对象
- 属性名称
let person = {}
Object.defineProperties(person, {
name: {
value: 'John',
writable: false
},
age: {
value: 20,
get: function() {
console.log('年龄'+ this.age)
return this.age
}
}
})
// 获取
let decription1 = Object.getOwnPropertyDescriptor(person, 'age');
console.log(decription1.value) // 20
console.log(typeof decription1.get) // function
let decription2 = Object.getOwnPropertyDescriptor(person, 'name');
console.log(decription2.value) // John
console.log(typeof decription2.get) // undefine
hasOwnProperty()与in
- in,无论属性存在于实例对象本身还是其原型上,都返回true
- hasOwnProperty(),只有当改属性存在于示例对象本身上时,才返回true
function Person() {}
Person.prototype.sayName = function() {}
let p = new Person();
p.name = 'John';
console.log(p.hasOwnProperty('sayName')) // false
console.log('sayName' in p) // true
console.log('name' in p) // true
console.log(p.hasOwnProperty('name')) // true