JS - Object.defineProperty 上

195 阅读1分钟
Object.defineProperty(obj, propName, description)
  • obj:需要被修改的对象

  • propName:相当于 对象 的属性名

  • description:当前这个对象的特性

数据描述:decsription

  • value:属性的值,可以使任意值,默认为 undefined
var obj = {}
Object.defineProperty(obj, 'name',{})
Object.defineProperty(obj, 'age',{
    value: 18
})

console.log(obj.name) // undefined
console.log(obj.age) // 18
  • writable:属性值是否可以被重写 —— false:不可被修改 true:可以被修改
var obj = {}
Object.defineProperty(obj, 'name', {
    value: '人间富贵花',
    writable: true
})
obj.name = 'RJFGH'
console.log(obj.name) // RJFGH

Object.defineProperty(obj, 'age',{
    value: 18,
    writable: false
})
obj.age= 20
console.log(obj.age) // 18
  • enumerable:是否可以被枚举 for ... in 或者 Object.keys()
var obj = {}
Object.defineProperty(obj, 'name',{
	value: '人间富贵花',
	enumerable: true
})
console.log(Object.keys(obj)) //[name]

Object.defineProperty(obj, 'age',{
	value: 18,
	enumerable: false
})
console.log(Object.keys(obj)) // [name]
  • configurable:是否可以删除目标属性或者可以再次修改属性特征(writable、enumerable、configurable)

注意:这里不是修改属性值,而是属性特征

// 一:不可删除属性
var obj = {}
Object.defineProperty(obj, 'name', {
    value: '人间富贵花',
    writable: false,
    enumerable: false,
    configurable: false
})
delete obj.name       // 删除属性
console.log(obj.name // 人间富贵花  删除不生效

// 二:可以删除属性
var obj = {} 
Object.defineProperty(obj, 'name',{
    value: '',
    writable: false,
    enumerable: false,
    configurable: false  
})
delete obj.name        // 删除属性
console.log(obj.name) //undefined 删除生效

//三:不可修改属性特征
var obj = {}
Object.defineProperty(obj, 'name',{
    value: '人间富贵花',
    writable: false,
    enumerable: false,
    configurable: false      // 不可修改属性特征
})
Object.defineProperty(obj, 'name',{
	writabe: true         // 属性特征修改无效 依旧是 false
}) 
obj.name = 'RJFGH'     // writable: false 
console.log(obj.name) // '人间富贵花'

//四:可修改属性特性
var obj = {}
Object.defineProperty(obj, 'name', {
    value: '人间富贵花',
    writable: false,
    enumerable: false,
    configurable: true   // 可修改属性特征
})

Object.defineProperty(obj, 'name',{
    writable: true       // 属性特征修改成功
})
obj.name = 'RJFGH'     // writable: true
console.log(obj.name) // RJFGH

属性特征小结:

  • value:设置属性的值
  • writable:属性值是否可以被修改 【 false | true 】
  • enumerable: 目标属性是否可被枚举 【false | true】
  • configurable:目标属性是否可以被删除、是否可以再次修改属性特征 【false | true】