这是《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中属性的特性值的更多相关文章

  1. ECMAScript 6中的数组操作方法

    本文介绍ECMAScript 6即将带给我们新的数组操作方法,以及在怎样在现有浏览器应用这些新的数组特性. Note: 我将使用交替使用构造器(constructor)和类(class)两个术语. 类 ...

  2. JavaScript数据结构与算法(八) 集合(ECMAScript 6中定义的类似的Set类)

    TypeScript方式实现源码 // 特性: // 1. 集合是由一组无序且唯一(即不能重复)的项组成的.这个数据结构使用了与有限集合相同的数学概念,但应用在计算机科学的数据结构中. // 2. 也 ...

  3. js中属性类型:数据属性与访问器属性

    js中属性类型分为两种:数据属性和访问器属性 在js中,对象都是由名值对构成的,名:就是我们所说的属性名,值就是属性对应的值(基本值.对象.方法). ECMA-262第5版定义了只有内部才用的特性,描 ...

  4. ECMAScript 5中对Array中新增了9个方法

    ECMAScript 5中对Array中新增了9个方法: 5个迭代方法(循环操作数组中的各个项):forEach(),map(),filter(),every()和some() 2个归并方法(迭代数组 ...

  5. VB类模块中属性的参数——VBA中Range对象的Value属性和Value2属性的一点区别

    在VB中,属性是可以有参数的,而VBA中属性使用参数非常常见.比如最常用的:Worksheet.Range("A1:A10")  VB的语法,使用参数的不一定是方法,也有可能是属性 ...

  6. ECMAScript 6中的let和const关键词

    ECMAScript 6中多了两个定义变量的关键词,一个是let,另一个是const,后者顾名思义就是常量定义,前者的作用域范围是块级的. 一般写过js的童鞋都知道,同其他语言一样,JS中的变量作用域 ...

  7. ECMASCRIPT 6中字符串的新特性

    本文将覆盖在ECMAScript 6 (ES6)中,字符串的新特性. Unicode 码位(code point)转义 Unicode字符码位的长度是21位[2].而JavaScript的字符串,是1 ...

  8. [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. 为什么Nhibernate中属性和方法必须Virtual的

    如果你曾经用过NHibernate 2.0或者更高的版本,那您一定碰到过下面的错误:NHibernate.InvalidProxyTypeException: The following types ...

随机推荐

  1. ajax post提交form表单 报400错误 解决方法

    昨天晚上做项目遇到了一个奇怪的问题,我用ajax提交一个form表单,后台Java方法用的是一个实体接,但是他根本不进方法体中,直接给我一个400的错误,一开始我以为是我路径的问题(尴尬),结果直接访 ...

  2. SQL Server2008清除数据库日志

    m缪国瑞  11:10:17 --'这里的DNName_Log 如果不知道在sys.database_files里是什么名字的话,可以用以下注释的语句进行查询USE dochuanGOSELECT f ...

  3. C#线程入门---转载

    C#中的线程(一)入门 文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari,  翻译 Swanky Wu 中 ...

  4. 多线程导出大规模excel文件

    文章有点水,和前几篇没有太大区别,但是单线程处理大文件导出会非常耗时间,用到多线程才能更加合理的利用资源.大文件也可能会超出excel工作表范围.这里也有相应处理 参考:用DataGridView导入 ...

  5. 在一个SQL Server表中的多个列找出最大值

    在一个SQL Server表中一行的多个列找出最大值 有时候我们需要从多个相同的列里(这些列的数据类型相同)找出最大的那个值,并显示 这里给出一个例子 IF (OBJECT_ID('tempdb..# ...

  6. ubuntu-14.04.2-desktop使用方法

    一.安装VMware Tools 1. 在VMware Workstation11.1.0下安装Ubuntu镜像:ubuntukylin-14.04.2-desktop-amd64.iso 2. 点击 ...

  7. java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**

    在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...

  8. [ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - 委托和事件

    在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...

  9. Hadoop学习笔记——搭建

    一搭建环境列表 操作系统:centos6.5 64位 JDK环境:jdk1.7.0_71 hadoop版本:社区版本2.7.2,hadoop-2.7.2-src.tar.gz 主机名 ip 角色 用户 ...

  10. fir.im Weekly - TouchBar 从入门到开发

    自从 Macbook Pro 发布重大更新, TouchBar 一直是开发者的重点关注对象.除了NSTouchBar官方文档,速度快者如 @毫无存在感的Cee,分享了一篇 NSTouchBar 的入门 ...