这是《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. tomcat相关

    一.下面这篇文章介绍了tomcat log相关内容 http://blog.csdn.net/cowmich/article/details/8173005

  2. MySQL5.6 GTID新特性实践

    MySQL5.6 GTID新特性实践 GTID简介 搭建 实验一:如果slave所需要事务对应的GTID在master上已经被purge了 实验二:忽略purged的部分,强行同步 本文将简单介绍基于 ...

  3. MYSQL删除重复数据

     delete from co_jobinformation cwhere c.name in (select cc.name from co_jobinformation cc group by   ...

  4. HTML实践发现(标签<pre>)

    1. (1).第一种编辑: (2).浏览器中显示: 2. (1).第二种编辑 (2).浏览器中显示: 结果发现:使用标签<pre>,在浏览器中显示的结果与在<pre>下方编写的 ...

  5. ubuntu下 编译安装swftools

    1.下载:http://www.swftools.org/download.html2.安装: tar -zvxf swftools-0.x.x.tar cd swftools-0.x.x ./con ...

  6. HDFS DataNode 设计实现解析

    前文分析了 NameNode,本文进一步解析 DataNode 的设计和实现要点. 文件存储 DataNode 正如其名是负责存储文件数据的节点.HDFS 中文件的存储方式是将文件按块(block)切 ...

  7. 解读ASP.NET 5 & MVC6系列(4):核心技术与环境配置

    asp.net 5是下一代的asp.net,该版本进行了全部重写以适用于跨平台,新新版本中,微软引入了如下工具与命令:DNVM.DNX.DNU. DNVM(.NET Version Manager): ...

  8. 业务安全通用解决方案——WAF数据风控

    业务安全通用解决方案——WAF数据风控 作者:南浔@阿里云安全 “你们安全不要阻碍业务发展”.“这个安全策略降低用户体验,影响转化率”——这是甲方企业安全部门经常听到合作团队抱怨.但安全从业者加入公司 ...

  9. Python黑帽编程 2.0 第二章概述

    Python黑帽编程 2.0 第二章概述 于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一 ...

  10. 如何给CentOS安装字体库

    很多时候,我们需要做一些图像生成工作(譬如验证码之类的),这时候,我们一般都需要用到系统的字体库.但事情却总非尽善人意,我们所使用的Linux操作系统无法像Windows操作系统那样足够“旗舰”,字体 ...