ECMAScript 5中属性的特性值
这是《JavaScript高级程序设计(第三版)》第六章相关内容的总结。
ECMAScript中有两种属性:数据属性和访问器属性。每种属性都有四个特性值。
数据属性的四个特性值:
[[Configurable]]:表示能否通过delete删除属性;能否修改属性的特性值;能否把属性修改为访问器属性。直接在对象上定义的属性,该特性的默认值为true。
[[Enumerable]]:表示能否通过for-in循环返回属性。直接在对象上定义的属性,该特性的默认值为true。
[[Writable]]:表示能否修改属性的值。直接在对象上定义的属性,该特性的默认值为true。
[[Value]]:包含这个属性的数据值。读取属性值的时候。从这个位置读;写入属性值的时候,把新值保存在这个位置。该特性的默认值为undefined。
访问器属性的四个特性:
访问器属性只能通过相应的方法设置,不能在对象上直接设置。
[[Configurable]]:表示能否通过delete删除属性;能否修改属性的特性值;能否把属性修改为数据属性。
[[Enumerable]]:表示能否通过for-in循环返回属性。
[[Get]]:在读取属性时调用的函数。该特性的默认值为undefined。
[[Set]]:在写入属性时调用的函数。该特性的默认值为undefined。
ECMAScript 5中操作属性特性的方法有3个:
Object.defineProperty():该方法用来设置单个属性的特性。它接收三个参数:属性所在的对象、属性的名字和一个描述符对象。其中描述符对象的属性必须是:configurable、enumerable、writable、value、get、set中的一个或多个。当然要根据属性类型选择。
Object.defineProperties():这个方法是上一个方法的增强版,可以同时设置多个属性的特性。它接收两个对象参数:第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应(通过例子看,一目了然)。
Object.getOwnPropertyDescriptor():这个方法返回一个描述符对象,可以取得给定属性的特性的值。它接收两个参数:属性所在的对象和要读取其特性的属性名称。如果是数据属性,返回的对象有configurable、enumerable、writable、value四个属性;如果是访问器属性,返回的对象有configurable、enumerable、get、set四个属性。
例1
<script type="text/javascript">
var a = {
name: 'A',
type: 'object'
}
//修改直接在对象上定义的属性的值
Object.defineProperty(a,'type',{
value: 'car'
});
//用Object.defineProperty()方法给对象添加属性
Object.defineProperty(a,'style',{
value: 'no'
});
//设置访问器属性
Object.defineProperty(a,'country',{
get: function() {
return 'none';
}
}); var b = Object.getOwnPropertyDescriptor(a,'type');
alert(b.configurable);//true
alert(b.enumerable);//true
alert(b.writable);//true var c = Object.getOwnPropertyDescriptor(a,'style');
alert(c.configurable);//false
alert(c.enumerable);//false
alert(c.writable);//false var d = Object.getOwnPropertyDescriptor(a,'country');
alert(a.country);//none
alert(d.configurable);//false
alert(d.enumerable);//false
alert(d.set);//undefined
alert(d.get);//输出get后面完整的匿名函数
</script>
通过上面的例子可以看到,用Object.defineProperty()方法给对象添加新属性,该属性的未指定的特性值要么默认为false,要么默认(set)为undefined,说明用Object.defineProperty()方法添加的新属性除非明确设置,否则一旦设置完成后是不可配置和更改的。而原本直接定义在对象上的属性,用Object.defineProperty()方法修改,未指定的特性值仍然默认为true,还是可以配置和更改的。
例2
var a = {
name: 'A',
type: 'object'
}
//修改直接在对象上定义的属性的值
Object.defineProperty(a,'type',{
configurable: false,
value: 'car'
});
delete a.type;
var b = Object.getOwnPropertyDescriptor(a,'type');
console.log(a.type);//car
console.log(b.configurable);//false
Object.defineProperty(a,'type',{
configurable: true
});
上面代码在火狐的Firebug中会报错:

意思就是说,一旦把configurable设置为false,就改不回来了。书上说,此时再调用Object.defineProperty()方法修改除writable的特性,都会导致错误。但是,我觉得这要根据这个属性是怎么添加到对象上的来区分。
先看直接在对象上直接定义的属性:
var a = {
name: 'A',
type: 'object'
}
//修改直接在对象上定义的属性的值
Object.defineProperty(a,'type',{
configurable: false,
value: 'car'
});
console.log(a.type);//car
console.log(b.configurable);//false
Object.defineProperty(a,'type',{
writable: false,
value: 'to'
});
var b = Object.getOwnPropertyDescriptor(a,'type');
console.log(b.value);//to
console.log(b.writable);//false
console.log(a.type);//to
输出结果:

再调用Object.defineProperty()方法修改除writable的特性(这里修改了value的值),没有导致错误,而且还修改成功了(当然修改enumerable的值还是会导致错误的)。
再来看通过调用Object.defineProperty()方法添加的属性:
var a = {
name: 'A',
type: 'object'
}
//修改直接在对象上定义的属性的值
Object.defineProperty(a,'style',{
configurable: false,
value: 'jiangnan'
});
var b = Object.getOwnPropertyDescriptor(a,'style');
console.log(a.style);//jiangnan
console.log(b.configurable);//false
Object.defineProperty(a,'style',{
writable: true,
value: 'to'
});
看运行结果:

再调用Object.defineProperty()方法修改writable的特性,导致错误。
下面看Object.defineProperties()方法的用法:
var a = {};
Object.defineProperties(a,{
name: {
value: 'A'
//其余的三个特性未明确指定,默认值为false
},
type: {
get: function() {return 'object'}
//set未指定,默认为undefined
//其余两个特性默认为false
}
});
console.log(a.type);//object
var b = Object.getOwnPropertyDescriptor(a,'name');
console.log(b.writable);//false
Object.defineProperty(a,'name',{
writable: true,
});
运行结果:

以上就是关于对象属性特性的内容。
ECMAScript 5中属性的特性值的更多相关文章
- ECMAScript 6中的数组操作方法
本文介绍ECMAScript 6即将带给我们新的数组操作方法,以及在怎样在现有浏览器应用这些新的数组特性. Note: 我将使用交替使用构造器(constructor)和类(class)两个术语. 类 ...
- JavaScript数据结构与算法(八) 集合(ECMAScript 6中定义的类似的Set类)
TypeScript方式实现源码 // 特性: // 1. 集合是由一组无序且唯一(即不能重复)的项组成的.这个数据结构使用了与有限集合相同的数学概念,但应用在计算机科学的数据结构中. // 2. 也 ...
- js中属性类型:数据属性与访问器属性
js中属性类型分为两种:数据属性和访问器属性 在js中,对象都是由名值对构成的,名:就是我们所说的属性名,值就是属性对应的值(基本值.对象.方法). ECMA-262第5版定义了只有内部才用的特性,描 ...
- ECMAScript 5中对Array中新增了9个方法
ECMAScript 5中对Array中新增了9个方法: 5个迭代方法(循环操作数组中的各个项):forEach(),map(),filter(),every()和some() 2个归并方法(迭代数组 ...
- VB类模块中属性的参数——VBA中Range对象的Value属性和Value2属性的一点区别
在VB中,属性是可以有参数的,而VBA中属性使用参数非常常见.比如最常用的:Worksheet.Range("A1:A10") VB的语法,使用参数的不一定是方法,也有可能是属性 ...
- ECMAScript 6中的let和const关键词
ECMAScript 6中多了两个定义变量的关键词,一个是let,另一个是const,后者顾名思义就是常量定义,前者的作用域范围是块级的. 一般写过js的童鞋都知道,同其他语言一样,JS中的变量作用域 ...
- ECMASCRIPT 6中字符串的新特性
本文将覆盖在ECMAScript 6 (ES6)中,字符串的新特性. Unicode 码位(code point)转义 Unicode字符码位的长度是21位[2].而JavaScript的字符串,是1 ...
- [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 为什么Nhibernate中属性和方法必须Virtual的
如果你曾经用过NHibernate 2.0或者更高的版本,那您一定碰到过下面的错误:NHibernate.InvalidProxyTypeException: The following types ...
随机推荐
- ajax post提交form表单 报400错误 解决方法
昨天晚上做项目遇到了一个奇怪的问题,我用ajax提交一个form表单,后台Java方法用的是一个实体接,但是他根本不进方法体中,直接给我一个400的错误,一开始我以为是我路径的问题(尴尬),结果直接访 ...
- SQL Server2008清除数据库日志
m缪国瑞 11:10:17 --'这里的DNName_Log 如果不知道在sys.database_files里是什么名字的话,可以用以下注释的语句进行查询USE dochuanGOSELECT f ...
- C#线程入门---转载
C#中的线程(一)入门 文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari, 翻译 Swanky Wu 中 ...
- 多线程导出大规模excel文件
文章有点水,和前几篇没有太大区别,但是单线程处理大文件导出会非常耗时间,用到多线程才能更加合理的利用资源.大文件也可能会超出excel工作表范围.这里也有相应处理 参考:用DataGridView导入 ...
- 在一个SQL Server表中的多个列找出最大值
在一个SQL Server表中一行的多个列找出最大值 有时候我们需要从多个相同的列里(这些列的数据类型相同)找出最大的那个值,并显示 这里给出一个例子 IF (OBJECT_ID('tempdb..# ...
- ubuntu-14.04.2-desktop使用方法
一.安装VMware Tools 1. 在VMware Workstation11.1.0下安装Ubuntu镜像:ubuntukylin-14.04.2-desktop-amd64.iso 2. 点击 ...
- java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**
在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...
- [ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - 委托和事件
在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...
- Hadoop学习笔记——搭建
一搭建环境列表 操作系统:centos6.5 64位 JDK环境:jdk1.7.0_71 hadoop版本:社区版本2.7.2,hadoop-2.7.2-src.tar.gz 主机名 ip 角色 用户 ...
- fir.im Weekly - TouchBar 从入门到开发
自从 Macbook Pro 发布重大更新, TouchBar 一直是开发者的重点关注对象.除了NSTouchBar官方文档,速度快者如 @毫无存在感的Cee,分享了一篇 NSTouchBar 的入门 ...