ECMA-262第5版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特性。ECMA-262定义这些特性是为了实现javascript引擎用的,因此在javascript中不能直接访问它们。为了表示特性是内部值,该规范把它们放在了两对方括号中,例如[[Enumerable]]。

  ECMAScript中有两种属性:数据属性和访问器属性

  1、数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性。

    [[Configurable]]: 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。直接在对象上定义的  属性,它们的这个特性默认值为true。

    [[Enumerable]]:表示能否通过for-in循环返回属性。直接在对象上定义的属性,它们的这个特性默认值为true。

    [[Writable]]:表示能否修改属性的值。直接在对象上定义的属性,它们的这个特性默认值为true。

    [[Value]]:包含着歌属性的数据值。读取属性值的时候,从这个位置读;写入属性的时候,把新值保存在这个位置。这个特性的默认值为undefined。

  例如:

    var person = {name:"zcybb"};

  像这样直接在对象上定义的属性,它们的[[Configurable]],[[Enumerable]],[[Writable]]特性都被设置为true,而[[Value]]特性被设置为指定的值。

  要修改属性默认的特性,必须使用ECMAScript 5的Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象,属性的名字和一个描述符对象,设置其中的一或多个值,可以修改对应的特性值。

  例如:

    var person = {};

    Object.defineProperty(person,"name",{

      writable:false,

      value:"bbzcy"

    });

  这个例子创建了一个名为name的属性,它的"bbzcy"是只读的,这个属性的值是不可修改的,如果尝试为它指定新值,在非严格模式下,赋值操作将被忽略,在严格模式下,赋值操作将会导致抛出错误。

  把configurable设置为false,表示不能从对象中删除属性。而且一旦把属性定义为不可配置的,就不能再把它变回可配置的了,此时再调用Object.defineProperty()方法修改除了writable之外的特性,都会导致错误。

  也就是说,可以多次调用Object.defineProperty()方法修改同一个属性,但在把 configurable特性设置为false之后就会有限制了。

  在调用Object.defineProperty()方法创建一个新的属性时,如果不指定,configurable,enumerable和writable特性的默认值都是false。

  

  2、访问器属性

  访问器属性不包含数据值;它们包含一对getter和setter函数(不过这两个函数都不是必需的)。在读取访问器属性时会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数,并传入新值,这个函数负责决定如何处理数据。访问器属性有如下4个特性。

    [[Configurable]]: 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。直接在对象上定义的属性,它们的这个特性默认值为true。

    [[Enumerable]]:表示能否通过for-in循环返回属性。直接在对象上定义的属性,它们的这个特性默认值为true。

    [[Get]]:在读取属性时调用的函数,默认值为undefined。

    [[Set]]:在写入属性时调用的函数,默认值为undefined。

  访问器属性不能直接定义,必须使用Object.defineProperty()方法来定义。如下例子:

  var book = {

    _year:2004,

    edition:1

  };

  Object.defineProperty(book,"year",{

    get:function(){

      return this._year;

    },

    set:function(newValue){

      if(newValue>2004){

        this._year = newValue;

        this.edition +=newValue-2004;

      }

    }

  })

  

  在这个方法之前,要创建访问器属性,一般都使用两个非标准的方法:

  book.__defineGetter__("year",function(){

    return this._year;

  });

  

  book.__defineSetter__("year",function(newValue){

    if(newValue > 2004){

      this._year = newValue;

      this.edition +=newValue-2004;

    }

  });

  定义多个属性:

  

  var book = {};

  Object.defineProperty(book,{

    _year:{writable:true,value:2004},

    edition:{writable:true,value:1},

    year:{

      get:function(){

        return this._year;

      },

      set:function(newValue){

        if(newValue>2004){

          this._year = newValue;

          this.edition +=newValue-2004;

        }

      }

    }

  }

)

javascript中的属性类型的更多相关文章

  1. JavaScript中判断对象类型方法大全1

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

  2. JavaScript中判断对象类型的种种方法

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

  3. 转 JavaScript中判断对象类型的种种方法

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

  4. JavaScript中两种类型的全局对象/函数【转】

    Snandy Stop, thinking is the essence of progress. JavaScript中两种类型的全局对象/函数 这里所说的JavaScript指浏览器环境中的包括宿 ...

  5. javaScript中Number数字类型方法入门

    前言 Number和Math都属于JavaScript中的内置对象,Number数字类型作为基础数据类型,我们在开发过程中会经常用到,包括数字精度的格式化,还有字符串转换成数字等操作. Number数 ...

  6. DTD中的属性类型

    <![CDATA[文本内容]]> DTD中的属性类型 全名:character data 在标记CDATA下,所有的标记.实体引用都被忽略,而被XML处理程序一视同仁地当做字符数据看待, ...

  7. 深入理解JavaScript中的属性和特性

    深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...

  8. Javascript中length属性的总结

    Javascript中length属性的总结 一.StringObject中的length     length属性是返回字符串的字符数目. 例如: // 普通字符串 var str = " ...

  9. [转] JavaScript中的属性:如何遍历属性

    在JavaScript中,遍历一个对象的属性往往没有在其他语言中遍历一个哈希(有些语言称为字典)的键那么简单.这主要有两个方面的原因:一个是,JavaScript中的对象通常都处在某个原型链中,它会从 ...

随机推荐

  1. SGU 131. Hardwood floor 状压dp 难度:2

    131. Hardwood floor time limit per test: 0.25 sec. memory limit per test: 4096 KB The banquet hall o ...

  2. 12.21 Gson的常用用法 功能介绍 特点

    使用谷歌GSON常用语法: 功能:映射Java Object与json格式的数据 1.通过Annotation注解来声明 2.支持自定义属性名称 3.支持包含或排除属性 4.支持自定义接口自己完成解析 ...

  3. iOS笔记之网络

    用POST方式上传数据时,数组怎么处理? NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data ...

  4. C# 解决datatable写入文件内存溢出问题

    1.程序生成目标平台设为x64 2.文件写入后主动回收内存

  5. (转)高并发Web服务的演变——节约系统内存和CPU

    一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加Web系统的机器和升级硬件配置.虽然现 ...

  6. Idea 使用 Maven 搭建 Web 项目

    传送门: 袁咩咩的小小博客 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 使用它来搭建项目可以省去很多操作,它不仅有依赖管理.自动生成项目站 ...

  7. CH1808 Milking Grid

    题意 POJ2185 数据加强版 描述 Every morning when they are milked, the Farmer John's cows form a rectangular gr ...

  8. .NET委托解析(异步委托)

    上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.NET 委托的内部实现,从浅入深的角度来详细的去解析委托的实质,本文将系上篇继续讨论异步委托的实现以及异步委托的源 ...

  9. 【python】 使用 setuptools

    不会安装python的egg文件,在网上搜索了一下,被“蟒蛇蛋”这个词雷到了,记录下. 随着对python的逐渐使用,发现一些python组件是用一个包管理器发布的,今天搞了快一个小时,终于搞定了,这 ...

  10. ROS创建Web代理(Web proxy)给QQ使用HTTP代理

    使用Web代理可以提高网页的访问速度,因为访问的数据会存储在内存或是硬盘中,就会直接从代理服务器中读取.同时,为了提高网络访问的安全性,可以给Web代理服务器设置相应的权限,使它的安全性得到提高. 下 ...