偷梁换柱
发布时间 2023-06-02 09:23:23作者: GTK
习题链接
偷梁换柱
偷梁换柱
现在有一个person对象,里面存储了一个人年龄age属性
要求在对age进行录入的时候,值在0-150之间正常赋值
若值小于0 就赋 0
若值大于150 就赋 150
关键点
- Object.defineProperties(目标对象,{在这里操作该对象的属性}) 操作多个属性的
- 目标对象是一个object对象即可
- {在这里操作该对象的属性}要对目标对象的属性进行描述
- 这个时候知道你听的很懵 只需要记得在这个{}括号里面是要操作对象里面的属性的
- 一个属性里面四个描述符号 最下方会告诉语法结构如何编写
- value:0, // =>值
- configurable:true, // =>默认值true,是否可以被删除再重新定义,若值为false,这个属性就无法被删除
- enumerable:true, // =>默认值true,在for in中是否可以遍历
- writable:true // =>默认值true,是否可以被修改,若是在defineProperties,或defineProperty中定义的属性,需要写明这个描述writable:true
- 一个属性还有两个方法
- get访问属性随之触发该函数
- set设置属性值,随之触发,可以对设置的值进行一个拦截,这个题目就是在set中进行拦截,但切不可使用this.当前属性值,否则会爆栈,直接报错
- Object.defineProperty(目标对象,目标属性,{操作当前属性}) 操作单个属性的
代码实现 && 完整的代码
- 完整code
// 请不要更改这个对象里面的内容
let person = {
age: 0,
};
// TODO:在这里写入具体的实现逻辑
// 对 person 的 age 属性更新行为进行拦截
// 如果输入的年龄在 0 - 150 之间,则认为是合法
// 否则,如果小于 0,则返回 0;如果大于 150,则返回 150
Object.defineProperties(person,{
'age_':{
value:0, // =>值
writable:true // =>是否可以被修改
},
'age':{
get(){
return this.age_; // 访问的旧属性=>返回新属性值
},
set(newValue,oldValue){ // 给旧属性设置值=>给新属性设置值
if(newValue < 0) this.age_ = 0;
else if(newValue >= 0 && newValue < 150) this.age_ = newValue;
else this.age_ = 150;
}
}
})
module.exports = person; // 检测需要,请勿删除