const obj1 = {
age: 18,
color: ‘yellow‘,
gender: ‘male‘,
work: ‘true‘
}
/* 对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。
数据描述符是一个具有值的属性,该值可以是可写的,也可以是不可写的。
存取描述符是由 getter 函数和 setter 函数所描述的属性。一个描述符只能是这两者其中之一;不能同时是两者 */
// writable 默认false 意思是 不可改变
Object.defineProperty(obj1, ‘ids‘, {
value: 2233, // 该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认是 undefined
configurable: true, // 是否可以删除 默认值 false
writable: true, // 是否可进行改变重写 默认值 false
enumerable: true // 是否可以遍历出来 默认值 false
})
obj1.ids = 3301
console.log(obj1.ids)
for (i in obj1) {
console.info(`${i} 是 等于`, obj1[i])
}
delete obj1.ids
delete obj1.work
// 删除对象的属性
// delete 对象名.属性
console.log(obj1)
下面来看看他的 get 和 set
let id = 123
const obj1 = {
age: 18,
color: ‘yellow‘,
gender: ‘male‘,
work: ‘true‘
}
Object.defineProperty(obj1, ‘ids‘, {
// Invalid property descriptor. Cannot both specify accessors and a value or writable attribute
// value: id, // 写上报错 把它注掉 译: 无效的属性描述符。不能同时指定访问器和值或可写属性
set(value) {
console.log(‘set 调用‘)
id = value
},
get() {
console.log(‘get 调用‘)
return id
}
})
console.log(obj1)
/*
这里使用 一个变量 id 与 这个ids属性建立关联, 当读取obj1 的ids 属性时, get()函数 <=> getter 就会调用, 且返回值就是 id 的值,
当修改obj1 的 ids 属性时, set函数(setter) 就会被调用, 且会收到修改的具体值
*/
下面是实现两个对象之间的数据代理
// 数据代理: 通过一个对象代理对另一个对象中属性的操作 (读/写)
// invoke property getter 译: 调用属性的getter
const obj1 = { x: 1 }
const obj2 = { y: 2 }
Object.defineProperty(obj2, ‘x‘, {
get() {
return obj1.x
},
set(value) {
obj.x = value
}
})
原文:https://www.cnblogs.com/b1acklv5/p/15139371.html