知识-属性描述符
基本概念
- 属性描述符:用来描述对象属性的特性
- 数据描述符:包含
value、writable、configurable、enumerable四个属性
示例
const obj = {
name: 'zhangsan',
age: 18
}
// 获取自身属性的描述符
const desc = Object.getOwnPropertyDescriptor(obj, 'name')
console.log(desc) // 该属性的描述
/* {
value: 'zhangsan', // 这个属性的值
writable: true, // 这个属性的值是否可以被修改
enumerable: true, // 这个属性是否可以被枚举(遍历)
configurable: true // 这个属性描述符是否可以被修改
} */const obj = {
name: 'zhangsan',
age: 18
}
// 获取自身属性的描述符
const desc = Object.getOwnPropertyDescriptor(obj, 'name')
console.log(desc) // 该属性的描述
/* {
value: 'zhangsan', // 这个属性的值
writable: true, // 这个属性的值是否可以被修改
enumerable: true, // 这个属性是否可以被枚举(遍历)
configurable: true // 这个属性描述符是否可以被修改
} */属性描述符是可以被修改的
Object.defineProperty重新定义某一个属性的描述符 他不是直接修改,而是重新定义 他不是vue特有的,只是vue用到了这个方法
const obj = {
name: 'zhangsan',
age: 18
}
// 获取自身属性的描述符
const desc = Object.getOwnPropertyDescriptor(obj, 'name')
console.log(desc) // 该属性的描述
/* {
value: 'zhangsan', // 这个属性的值
writable: true, // 这个属性的值是否可以被修改
enumerable: true, // 这个属性是否可以被枚举(遍历)
configurable: true // 这个属性描述符是否可以被修改
} */
// 修改描述符
Object.defineProperty(obj, 'name', {
value: 'lisi',
writable: false,
enumerable: false,
configurable: false
})const obj = {
name: 'zhangsan',
age: 18
}
// 获取自身属性的描述符
const desc = Object.getOwnPropertyDescriptor(obj, 'name')
console.log(desc) // 该属性的描述
/* {
value: 'zhangsan', // 这个属性的值
writable: true, // 这个属性的值是否可以被修改
enumerable: true, // 这个属性是否可以被枚举(遍历)
configurable: true // 这个属性描述符是否可以被修改
} */
// 修改描述符
Object.defineProperty(obj, 'name', {
value: 'lisi',
writable: false,
enumerable: false,
configurable: false
})defineProperty的访问器
let obj = {}
Object.defineProperty(obj, 'name', {
/* value: 'zhangsan',
// writable: false, // 默认值是true
// enumerable: false, // 默认值是false
// configurable: false // 默认值是false */
// 读取器
get() {},
// 设置器
set(val) {}
})
// obj.name => 调用get
// obj.name = 'lisi' => 调用set => set(lisi)let obj = {}
Object.defineProperty(obj, 'name', {
/* value: 'zhangsan',
// writable: false, // 默认值是true
// enumerable: false, // 默认值是false
// configurable: false // 默认值是false */
// 读取器
get() {},
// 设置器
set(val) {}
})
// obj.name => 调用get
// obj.name = 'lisi' => 调用set => set(lisi)Object相关方法
Object.defineProperty重新定义某一个属性的描述符Object.defineProperties重新定义多个属性的描述符Object.getOwnPropertyDescriptors获取一个对象的所有自身属性的描述符Object.preventExtensions禁止一个对象添加新的属性Object.seal禁止一个对象添加新的属性,并且所有现有属性标记为不可配置Object.freeze禁止一个对象添加新的属性,并且所有现有属性标记为不可配置,同时所有现有属性标记为不可写Object.isExtensible判断一个对象是否可以添加新的属性Object.isSealed判断一个对象是否可以添加新的属性,并且所有现有属性标记为不可配置Object.isFrozen判断一个对象是否可以添加新的属性,并且所有现有属性标记为不可配置,同时所有现有属性标记为不可写Object.keys获取一个对象的所有自身可枚举属性的键名Object.getOwnPropertyNames获取一个对象的所有自身属性的键名Object.getOwnPropertySymbols获取一个对象的所有自身属性的键名Object.values获取一个对象的所有自身可枚举属性的键值Object.entries获取一个对象的所有自身可枚举属性的键值对Object.fromEntries将一个键值对列表转换为一个对象Object.assign将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象Object.create创建一个新对象,使用现有的对象来提供新创建的对象的__proto__Object.setPrototypeOf设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或 nullObject.getPrototypeOf返回指定对象的原型(内部[[Prototype]]属性的值)Object.is判断两个值是否为同一个值Object.isExtensible判断一个对象是否可以添加新的属性Object.isSealed判断一个对象是否可以添加新的属性,并且所有现有属性标记为不可配置Object.isFrozen判断一个对象是否可以添加新的属性,并且所有现有属性标记为不可配置,同时所有现有属性标记为不可写
zmx2321