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. Android 遍历全国的地区二(获取天气)

    根据上次的内容 1. 界面布局 weather_layout.xml <LinearLayout xmlns:android="http://schemas.android.com/a ...

  2. zookeeper和Kafka集群安装配置

    3个虚拟机,首先关闭防火墙,在进行下面操作 一.java环境 yum list java* yum -y install java-1.8.0-openjdk* 查看Java版本 Java -vers ...

  3. Bayes' theorem (贝叶斯定理)

    前言 AI时代的到来一下子让人感觉到数学知识有些捉襟见肘,为了不被这个时代淘汰,我们需要不断的学习再学习.其中最常见的就是贝叶斯定理,这个定理最早由托马斯·贝叶斯提出. 贝叶斯方法的诞生源于他生前为解 ...

  4. [批处理]批量提取MKV资源

    最初是下了部没字幕的动漫,是720P MKV格式的,当时没注意,下完了以后才发现是没字幕的 后来去射手上找没有,百度了半天也没有 最后只能求救与已经下了这部动漫是MKV格式且是内挂字幕的人来帮忙 最后 ...

  5. L201

    The American public’s obsession with dieting has led to one of the most dangerous healthmisconceptio ...

  6. [Tomcat无法启动]'Starting Tomcat v8.0 Server at localhost' has encountered a problem.

    运行一个index.jsp,运行提示如下错误:点击服务器 解决办法1: 点击Tomcat服务器,将服务器里的web工程删除掉,再重新运行index.jsp. 解决办法2: 关闭Tomcat,最简单的方 ...

  7. OutOfMemoryError系列(1): Java heap space

    每个Java程序都只能使用一定量的内存, 这种限制是由JVM的启动参数决定的.而更复杂的情况在于, Java程序的内存分为两部分: 堆内存(Heap space)和 永久代(Permanent Gen ...

  8. LightOJ - 1396 :Palindromic Numbers (III)(逐位确定法)

    Vinci is a little boy and is very creative. One day his teacher asked him to write all the Palindrom ...

  9. coredns 代理consul 运行noamd 部署的应用

    nomad 是一个方便的应用调度平台,consul 一个很不错的服务发现工具,coredns 很不错, 扩展性比较强的dns 服务器,集成起来可能做很强大的事情 我的运行环境是mac,实际情况按需部署 ...

  10. 洛谷[P1002]过河卒

    原题地址:https://www.luogu.org/problemnew/show/P1002 题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点 ...