javascript存储器属性与数据属性
在新的js规范中,我们又多了几种定义属性的方法。给一个对象添加属性,以前可能是这样的
var o = {name: '未起名';}
现在可以这样子
var o = {get name(){return '终生不改名'}}
o.name // 终生不改名
o.name = '换个名字';
o.name // 终生不改名;没法改变其值
还可以是这样子的
var o = {};
Object.defineProperty(o, name, {
value: '数据属性',
writable: true
})
// witable表示该属性是否可读写。false只可读,true可读写
o.name = '可修改的属性'
o.name // ?
当然还有其他的方式。
以上两种新的写法,第一种添加的属性叫做存储器属性(getter&setter),第二种是数据属性(value)。一个【属性描述符】不能同时包含value属性又有setter&getter之一。
【属性描述符】是一个对象,它是描述对象属性的。描述符一般有四个属性,分为存储器属性描述符和数据属性描述符(这个是我自己的分类)
//存储器属性描述符对象
{
get: function(){},
set:function(){},
enumerable:boolean,
configurable:boolean
} //数据属性描述符对象
{
value:'',
writable:boolean,
enumerable:boolean,
configurable:boolean
}
如果没有显式声明某属性,默认是undefined或者false。enumerable表示该属性是否可枚举。像很多内置的对象的属性一样,设为false,则此属性是不可以枚举的(for in循环无法遍
历)。configurable表示是否可配置,如是否可以用delete删除此属性,是否可以修改enumerable或者writable的值。writable是否可写,对于存储器属性,没有该项。其读写操作由get、
set完成。当然,这只是粗略的说明。
存储器属性
var name = '给孩子起个名吧',
person = {
// 读取属性
get childName(){
return name;
},
// 给属性写入值
set childName(newName){
name = newName;
},
// 是否可枚举
enumerable: true,
// 是否可配置
configurable: true
}
// 上面这几行代码近似于下面的效果
/*
var person = {childName: name};
*/
/*这种写法需要借助第三个变量或者属性来完成。因为在get和set使用【this.该属性】会造成无限递归,无法在set中无法给
该属性赋值,也无法在get中返回。要么借助第三者(get&set),要么返回常量(get)
*/
//一个可以读取,但不允许改变的值.例如产品的ID号,一旦生产,则不允许再修改
var product = {get pID(){return '113230'}}
product.pID = '231234' //1.0。企图改变pID的值是徒劳的
数据属性
/* 数据属性不能像存储器属性那样直接在对象内部声明,不然会变成普通属性。
需要借助defineProperty来完成*/
var o = {};
//defineProperty接受三个参数,对象,对象的属性名,属性描述符(也是对象)
Object.defineProperty(o,'name',{
value: '这是数据属性',//这个值也可以是个函数,调用:o.name()
writable: true,
enumerable: true,
configurable: true
}); o.name // 这是数据属性 //存储器属性也可以用这种方式(添加多个属性用defineProperties),给一个矩形rect添加三个属性,w,h,area var rect = {};
Object.defineProperties(rect, {
w:{value:10,writable:true},
h:{value:15,writable:true},
area: {
get: function(){
return this.w*this.h;
},
set: function(newVal){
var rat = newVal/this.area;
this.w *= rat;
this.h *= rat;
}
}
});
rect.area // 150
rect.area *= 2;
//改变面积的值,间接改变长和宽
rect.w // 20
rect.h // 30
总结:利用这些API可以实现很多意想不到的功能,除了保持对象属性不变,可以监听属性变化、读取(类似日志),还能像内置对象的属性一样,扩展得方法也能不被枚举出来。
javascript存储器属性与数据属性的更多相关文章
- javascript对象属性——数据属性和访问器属性
ECMA-262第五版在定义时,描述了属性property的各种特征,定义这些特性是为了实现javascript引擎用的,为了表示该特性是内部值,规范把它们放在了两对儿方括号中,例如[[Enumera ...
- JavaScript对象的两类属性(数据属性与访问器属性)
对JavaScript来说,属性并非只是简单的名称和值,JavaScript用一组特征(attribute)来描述属性 (property). 第一类属性数据属性具有四个特征. value:就是属性的 ...
- javascript 查找属性的过程
当执行 一个对象赋值操作的时候 js引擎会怎样处理呢??? 例如 有个foo对象 ,要进行这个操作 foo.a=2 1, 首先会在foo对象中查找,如果不存在a属性,就会去原型链上面找,如果原 ...
- ECMAScript中有两种属性:数据属性和访问器属性。
ECMA-262定义这些特性是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问它们.为了表示特性是内部值,该规范把它们放在了两对儿方括号中,例如 [[Enumerable ...
- JavaScript document属性和方法
JavaScript document属性和方法 --------------------------------------------属性: 1. Attributes 存储节点的属性列表 ...
- JavaScript 全局属性/函数
JavaScript 全局 JavaScript 全局属性和方法可用于创建Javascript对象. JavaScript 全局属性 属性 描述 Infinity 代表正的无穷大的数值. NaN 指示 ...
- 删除要被替换的元素的所有事件处理 程序和 JavaScript 对象属性
使用本节介绍的方法替换子节点可能会导致浏览器的内存占用问题,尤其是在 IE 中,问题更加明显.在删除带有事件处理程序或引用了其他 JavaScript 对象子树时,就有可能导致内存占用问题.假设 某个 ...
- Javascript对象属性与方法汇总
Javascript对象属性与方法汇总 发布时间:2015-03-06 编辑:www.jquerycn.cn 详细介绍下,javascript对象属性与对象方法的相关知识,包括javascript字符 ...
- javascript 节点属性详解
javascript 节点属性详解 根据 DOM,html 文档中的每个成分都是一个节点 DOM 是这样规定的:整个文档是一个文档节点每个 html 标签是一个元素节点包含在于 html 元素中的文本 ...
随机推荐
- jQuery最佳实践:如何用好jQuery
一.用对选择器 在jQuery中,你可以用多种选择器,选择同一个网页元素.每种选择器的性能是不一样的,你应该了解它们的性能差异. (1)最快的选择器:id选择器和元素标签选择器 举例来说,下面的语句性 ...
- pyspider介绍及安装
一.pyspider简介 1.通过python脚本进行结构化信息的提取,follow链接调度抓取控制,实现最大的灵活性 2.通过web化的脚本编写.调试环境.web展现调度状态 3.抓取环模型成熟稳定 ...
- 将思维转向rss
本屌丝因为穷住在了离市区比较远的农民房,平时上下班单程地铁时间接近一小时.在这漫长的一小时里,总得干点什么来蹉跎这段时光,看手机是最容易实现的事情.最地铁信号不好,手机也没什么好看的. 经过高人指点说 ...
- nginx 相关命令 nginx -s reload/stop/quit
nginx 相关命令 学习了:https://www.cnblogs.com/zoro-zero/p/6590503.html start nginx 或者在linux上面直接 nginx ngin ...
- Groovy(java)+Spock+IDEA+maven+Jenkins+SVN+maven-surefire-plugin+maven-surefire-report-plugin/maven-antrun-extended-plugin集成接口测试框架
文章为原创,未经本人授权禁止转载. 一.spock框架环境搭建. 二.基于spock框架的脚本开发. 三.基于spock框架的用例执行并生成HTML报告. 四.集成jenkins生成HTML报告. 五 ...
- 利用HTML5与jQuery技术创建一个简单的自动表单完成
来源:GBin1.com 在线演示 在线下载 谷歌快速搜索自带大量自动完成插件——库中甚至还有一个附带的jQuery UI共享选项.然而今天我要寻找一个替代的解决方案.由DevBridge开发的j ...
- VS2013编译boost1.55库
1. 官网下载最新的Boost库,我的是1.55 2. 在使用vs2013编译boost-1.55.0之前,先要给boost做下修改: boost_1_55_0\boost\intrusive\det ...
- TJU Easier Done than Said?
Password security is a tricky thing. Users prefer simple passwords that are easy to remember (like ...
- ZK框架笔记2、ZK框架安装、相关类库、web及zk配置
1.先去ZK官网注册一个账号 2.在MyEclipse菜单栏中Help----Eclipse Marketplace中搜索ZK Studio,点击install安装即可 3.相关类库 ...
- top命令的Load average 含义及性能参考基值
$ uptime11:12:26 up 3:44, 4 users, load average: 0.38, 0.31, 0.19 系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树.如果一个 ...