《JS权威指南学习总结--6.6属性getter和setter》
内容要点:
一.对象属性
对象属性是由名字、值和一组特性构成的。在ES5中,属性值可以用一个或两个方法替代,这两个方法就是getter和setter。由getter和setter定义的属性称做 "存储器属性",它不同于 "数据属性",数据属性就是一个简单的值。
当程序查询存取器属性的值时,JS调用getter方法(无参数)。这个方法的返回值就是属性存取表达式的值。
当程序设置一个存取器属性的值时,JS调用setter方法,将赋值表达式右侧的值当做参数传入setter。从某种意义上讲,这个方法负责 "设置"属性值。可以忽略setter方法的返回值。
和数据属性不同,存取器属性不具有可写性。如果属性同时具有getter和setter,那么它是一个读/写属性。如果它只有getter方法,那么它是一个只读属性。如果它只有setter方法,那么它是一个只写属性(数据属性中有一些例外),读取只写属性总是返回undefined.
二.定义存取器属性
定义存取器属性最简单的方法是使用对象直接量语法的一种扩展写法:
var o = {
//普通的数据属性
data_prop : value,
//存取器属性都是成对定义的函数
get accessor_prop() {/*这里是函数体*/},
set accessor_prop() {/*这里是函数体*/}
};
存取器属性定义为一个或两个和属性同名的函数,这个函数定义没有使用function关键字,而是使用get和(或)set.
注意,这里没有使用冒号将属性名和函数体分隔开,但在函数体的结束和下一个方法或数据属性之间有逗号分隔。
例如:
var p = {
//x和y是普通的可读写的数据属性
x : 1.0,
y : 1.0,
//r是可读写的存取器属性,它有getter和setter,
get r(){ return Math.sqrt(this.x*this.x + this.y*this.y) },
set r(newvalue){
var oldvalue = Math.sqrt(this.x*this.x + this.y*this.y);
var ratio = newvalue/oldvalue;
this.x *=ratio;
this.y *=ratio;
},
//theta是只读存取器属性,它只有getter方法
get theta(){ return Math.atan2(this.y , this.x); }
};
三.存取器属性是可以继承的
和数据属性一样,存取器属性是可以继承的,因此可以将上述代码中的对象p当做另一个 "点" 原型。可以给新对象定义它的x和y属性,但r和theta属性是可以继承的:
var q = inherit(p); //创建一个继承getter和setter的新对象
q.x=1,q.y=1; //给q添加两个属性
console.log(q.r); //可以使用继承的存取器属性
console.log(q.theta);
四.
//这个对象产生严格自增的序列号
var serialnum = {
//这个数据属性包含下一个序列号
//$符号暗示这个属性是一个私有属性
$n : 0 ,
//返回当前值,然后自增
get next(){ return this.$n++ },
set next(n){
if(n >= this.$n) this.$n = n;
else throw "序列号的直不能比当前值小"
}
};
//下面这个例子使用getter方法实现一种"神奇"的属性
//这个对象有一个可以返回随机数的存取器属性
//例如,表达式 "random.octet"产生一个随机数
//每次产生的随机数都在0-255之间
var random = {
get octet(){ return Math.floor(Math.random()*256); },
get uint16(){ return Math.floor(Math.random()*65536); },
get init16(){ return Math.floor(Math.random()*65536)-32768; }
};
《JS权威指南学习总结--6.6属性getter和setter》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- linux面试题集锦4《转》
四.编程与应用题: 1.用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下. 参考程序: #!/bin/sh FILENAME= echo “Input file na ...
- oracle 增加表空间
1.表空间使用情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D ...
- Web框架——Django笔记
Web框架--Django笔记 MVC和MTV MVC:Model.View.Controller MTV:Model.Template.View Django--MTV 1.创建Django程序 ...
- 几种主流浏览器内置http抓包工具软件使用方法
对于学习网站的人或者相关编程人员,经常需要用到http抓包工具来跟踪网页,但主流抓包软件如httpwatch.httpanalyzerstdv都是收费的,破解版往往也不稳定.实际上现在很多浏览器都内置 ...
- iOS中的布局
1.UIView 有三个比较重要的布局属性: frame , bounds 和 center , CALayer 对应地叫做 frame , bounds 和 position .为了能清楚区分,图层 ...
- retrofit2学习
http://www.cnblogs.com/wondertwo/p/5838528.html 使用要点
- Tomcat7性能优化
目的 通过优化tomcat提高网站的并发能力. 服务器资源 服务器所能提供CPU.内存.硬盘的性能对处理能力有决定性影响. 优化配置 配置tomcat管理员账户 在conf/ tomcat-users ...
- XTU 1245 Hamiltonian Path
$2016$长城信息杯中国大学生程序设计竞赛中南邀请赛$C$题 简单题. 注意题目中给出的数据范围:$1 \le ai < bi \le n$,说明这是一个有向无环图,并且哈密顿路一定是$1 \ ...
- PHP控制连接打印机
一.需求 使用PHP控制连接打印机 现场实时连续打印动态数据 二.配置 php运行环境正确安装(Apache|Nginx + PHP) 下载与php版本对应的php_printer.dll扩展 扩展文 ...
- 超实用 JS 代码段笔记(一)
序1:30段简单代码段(有删减) 1 . 区分 IE 和 非 IE 浏览器 if(!+[1,]){ console.log('ie浏览器'); }else{ console.log('非ie浏览器') ...