上篇讲到可以用属性描述符来对属性做一些描述,以及用来描述属性的四个属性(value,configurable,enumerable,writable)。这篇讲的存取器属性就是在属性描述符中配置get()和set()方法,配置这两个方法之后,该属性就不是一个普通属性了。存取器属性最大的意义,在于可以控制属性的读取和赋值。

如果一个属性是存取器属性,则读取该属性时,会运行get方法,将get方法得到的返回值作为属性值,如果给该属性赋值,则会运行set方法。举个栗子来理解一下叭~

【例1】

const obj = {b:2
}
Object.defineProperty(obj,'a',{get() {console.log("运行了属性a的get函数")},set() {console.log("运行了属性a的set函数")}
})
obj.a = 10;
console.log(obj.a)

【结果】可以看到,在对a进行赋值时,运行了set(),在访问a时,运行了get(),且因为get函数没有返回值,所以得到的值为undefined

要想实现上面的效果,即赋的值等于读取到的值,可以借用第三参数,如下

const obj = {b:2
}
Object.defineProperty(obj,'a',{get() {console.log("运行了属性a的get函数");return obj._a;},set(val) {console.log("运行了属性a的set函数");obj._a = val;}
})
//以下代码相当于set(10)
obj.a = 10;
console.log(obj.a);

【结果】

【注】get函数不能传参,set函数可以传一个参数

【例2】小练习:输入年龄,限定年龄范围在0-200岁,且输入必须为数字类型,输出XX岁。

obj = {name: 'jwh'
}
Object.defineProperty(obj, 'age', {get() {return `${obj._age}岁`;},set(val) {if (typeof val !== "number") {throw new TypeError("年龄必须是一个数字");}if (val < 0) {val = 0;} else if (val > 200) {val = 200;}obj._age = val;}
})
obj.age = 33;
console.log(obj.age);
obj.age = -10;
console.log(obj.age);
obj.age = 222;
console.log(obj.age);
obj.age = "aaa";
console.log(obj.age);

【结果】

JS —— 存取器属性get()和set()相关推荐

  1. JS中的setter、getter数据存取器

    JS属性可分为两种类型 ① 数据属性    只是简单存储了一个值 ② 存取器属性    最大的特点是在设置.获取属性值的时候能够做一些其他的操作 设置存取器属性的两种方式 ① 直接在对象中设置 let ...

  2. Js中的数据属性和访问器属性

    Js中的数据属性和访问器属性 在javaScript中,对象的属性分为两种类型:数据属性和访问器属性. 一.数据属性 1.数据属性:它包含的是一个数据值的位置,在这可以对数据值进行读写. 2.数据属性 ...

  3. 《js高级程序设计》6.1.1-6.1.3——数据属性、访问器属性

    数据属性:该属性包含了一个数据值的位置,它包含了4个描述行为的特性: 1. [[Configurable]]:表示是否能通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访 ...

  4. html iframe视频自动播放的属性,iframe通用js播放器myplayer.js加自动播放参数

    我的播放器调用方式,通用js播放器myplayer.js打开自动播放&后面的多余参数藐视不受影响. iframe可用于通用视频地址,.MP4去掉所有尾巴 &参数 最终自动播放mypla ...

  5. 复杂结构体的存取器 [C宏——智者的利刃,愚者的恶梦]

    为什么80%的码农都做不了架构师?>>>    C宏--智者的利刃,愚者的恶梦! 在<C宏--智者的利刃,愚者的恶梦! >一文中,提到了一种使用宏的方式 -- " ...

  6. 数据属性和访问器属性

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>数据 ...

  7. 摄屏播放插件html5,Js视频播放器插件Video.js使用方法详解

    Video.js快速入门 我们可以下载 Video.js 的源码放到自己的服务器上,或者使用免费的 CDN 托管版本. 在页面中引用video-js.cs样式文件和video.js 使用免费的CDN托 ...

  8. 理解 JS 装饰器:@Decorator

    Javascript 里的装饰器目前还处于 stage-2 阶段,借助 TypeScript 或者 Babel,已经有大量的优秀开源项目深度用上它了,比如:VS Code: 理解装饰器有助于帮助我们更 ...

  9. Vue:实例演示,v-if,v-for,v-model,v-bind,v-on,计算属性和侦听器属性

    Vue:实例演示,v-if,v-for,v-model,v-bind,v-on,计算属性和侦听器属性 一.实例演示,v-if,v-for,v-model,v-bind,v-on 方法 含义 v-bin ...

最新文章

  1. CentOS7.2中NFS1.3 安装
  2. python买什么书好-Python入门经典书籍有哪些?有这三本就够了
  3. 给定数组 求和等于固定值 算法_[见题拆题] 大厂面试算法真题解析 - 第一期开张...
  4. mac改终端前面的计算机名
  5. 神策数据出席 TIC 2018 大会,共同赋能大数据时代
  6. GDCM:gdcm::ImageHelper的测试程序
  7. 多线程——线程的生命周期
  8. textview多行ellipsize=end不显示省略号的解决方法(一)
  9. C#如何生成缩略图、水印
  10. 《自卑与超越》读书笔记(part3)--做梦就是在保护我们的生活模式不被现实和常识所威胁
  11. 爬虫那些事儿-- 简介
  12. 如何设置win7系统分辨率
  13. 重磅! SpringBoot+Sentinel+Nacos已撸完
  14. Theano2.1.11-基础知识之稀疏
  15. 如何打开VMware的vmdk虚拟磁盘文件
  16. Java J2EE中的依赖查找
  17. atititi.soa  微服务 区别 联系 优缺点.doc
  18. 辞职信辞职信辞职信辞职信
  19. 【Python】过滤表情字符
  20. ndk 的emac_德州仪器的EMAC外设开发包,配合NDK使用,应在CCS4.2版本以上使用

热门文章

  1. MFC六大核心机制之四:永久保存(串行化)
  2. RabbitMQ如何实现延迟队列?
  3. 音视频技术开发周刊 | 135
  4. CABR:Beamer的内容自适应速率控制算法
  5. Apple 低延迟HLS分析
  6. 如何ALL IN一场技术大会?
  7. LiveVideoStackCon 2018展现多媒体技术生态多样性
  8. ffplay.c学习-7-以音频同步为基准
  9. c/c++比较灵活的方法:回调函数和函数指针
  10. calico的两种网络模式BGP和IP-IP性能分析