偷梁换柱
习题链接
偷梁换柱
偷梁换柱
现在有一个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; // 检测需要,请勿删除