js没有类的概念,js里万物皆是对象,对象是无序属性的集合,其属性可以包含基本值,对象或者函数
属性类型分为两种,数据属性和访问器属性,其默认属性为数据属性。 例如:
let obj = {
age:18,
name:'cjz'
}
obj的name和age属性都是属于数据属性
-
数据属性
数据属性有4个描述符:
configurable:是否可以修改属性特性,或者删除属性(delete 属性名),默认值为trueenumerable:是否可以调用for-in循环,默认为truewritable:是否可以修改属性值,默认为truevalue:属性的值,默认为undefined 要修改属性默认的特性,必须使用Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象。如:
// 修改上述对象age属性为只读
Object.defineProperty(obj, 'age', {
writable: false
})
console.log(obj.age); // 18
obj.age = 28; // 严格模式报错
console.log(obj.age); // 18
// 修改上述对象age属性为不可配置,改属性改为不可配置后就不能删除或者重新修改configurable值,不能修改除writable以外的特性
Object.defineProperty(obj, 'age', {
configurable: false
})
console.log(obj.age); // 18
delete obj.age; // 严格模式报错
console.log(obj.age); // 18
使用Object.defineProperty()定义属性时,前3个属性特性都为false。
-
访问器属性
访问器属性有4个描述符:
configurable:是否可以修改属性特性,或者删除属性(delete 属性名),默认值为trueenumerable:是否可以调用for-in循环,默认为trueget:在读取属性时调用的函数,默认为undefinedset:在写入属性时调用的函数,默认为undefined 访问器属性必须使用Object.defineProperty()方法新增或修改(vuejs依赖收集就是用这个)
// 修改上述对象age属性为访问器属性
// set和get不一定要同时存在
Object.defineProperty(obj, 'age1', {
set(v) {
this.age = v + '岁';
},
get() {
return this.age
}
})
Object.defineProperties()可一次性定义多个属性,如:
Object.defineProperties(obj, {
tel: 描述符对象,
gender: 描述符对象,
})
Object.getOwnPropertyDescriptor()获取属性的描述符对象
Object.defineProperties(obj, 'age')