引言:前面的一章我们已经介绍了引用类型,其中在那一章我们大概了解到了“对象”这个概念。同时也提到 JavaScript 中函数也是对象,甚至可以提出“万物皆对象的概念”。那么在这一章我开始就对 JavaScript的“对象”开始一个学习总结,首先我们可以了解的是,面向对象都有一个“类”的概念。而通过类可以创建任意多个具有相同属性的方法和对象,但是在ECMAScript 中却没有类的概念。这也是JavaScript 不同于一般的面向对象的特别之处。对象在JavaScript中是一个重要知识点,所以这一章的内容会比较长,总结方面结构上我会依旧采用分章节总结,内容上我尽量不会偏基础的知识点,因为很多知识点我已经在前面有过多次提到(比如创建对象。添加属性等等),所以可以说这个总结方向会随着章节会慢慢的越来越不偏向基础,而是慢慢偏向一些难点,这也是我想要做的。而在一些知识点我也会尽量通过自己的积累来进行解释,尽量不全搬书上,这样一来无论是对自己的学习提升还是内容的补充都是很好的(其实我在前面几章也是这么做的)。

属性类型:

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

数据属性:

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

1、 [[Configurable] kən'fɪgərəbl ]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特 性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,它们的 这个特性默认值为 true。

2、[[Enumerable ] ɪ'nju:mərəbəl]]:表示能否通过 for-in 循环返回属性。像前面例子中那样直接在对象上定 义的属性,它们的这个特性默认值为 true。

3、[[Writable]'raɪtəbəl ]:表示能否修改属性的值。像前面例子中那样直接在对象上定义的属性,它们的 这个特性默认值为 true。

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

对于像前面例子中那样直接在对象上定义的属性,它们的[[Configurable]]、[[Enumerable]] 和[[Writable]]特性都被设置为 true,而[[Value]]特性被设置为指定的值。例如:

var person = { name: "Nicholas" }; 这里创建了一个名为 name 的属性,为它指定的值是"Nicholas"。

也就是说,[[Value]]特性将 被设置为"Nicholas",而对这个值的任何修改都将反映在这个位置。

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

把 configurable 设置为 false,表示不能从对象中删除属性。如果对这个属性调用 delete,则 在非严格模式下什么也不会发生,而在严格模式下会导致错误。而且,一旦把属性定义为不可配置的, 就不能再把它变回可配置了。此时,再调用 Object.defineProperty()方法修改除 writable 之外 的特性,都会导致错误,比如:

 1 var person = {};
 2 
 3 Object.defineProperty(person, "name", {
 4 
 5 configurable: false,
 6 
 7 value: "Nicholas"
 8 
 9 }); //抛出错误
10 
11 Object.defineProperty(person, "name", {
12 
13 configurable: true,
14 
15 value: "Nicholas"
16 
17 });

更多相关文章

  1. 如何从Java中的类名获取类对象
  2. 域对象/服务和业务逻辑层
  3. JavaScript笔记:混合对象“类”
  4. [零基础学JAVA]Java SE面向对象部分.面向对象基础(04)
  5. Java面向对象三大特性
  6. 请问java中调用一个静态方法()内传入一个对象是表示什么意思?
  7. Java记录 -88- 利用反射机制调用对象的私有方法和属性
  8. Java开发水吧点饮品系统(顶层父类对象做接口参数)
  9. 如何知道Object是否为String类型对象?

随机推荐

  1. Android 入门前言之 --布局
  2. android selector 背景选择器的使用, butt
  3. Android Studio系列(四)Version Control II
  4. 8大你不得不知的Android调试工具
  5. android 去掉顶部状态栏
  6. Android相对布局属性全集
  7. android:screenOrientation属性
  8. 文字跑马灯
  9. Android 9.0 Launcher源码分析(三)——Laun
  10. android button 正常状态,按下状态