JavaScript权威指南学习之第6章 对象

时间:2022-08-27 08:14:43

1、可以通过对象直接量、关键字new和(ECMAScript5中的)Object.create()函数来创建对象。

2、在ECMAScript 3中,点运算符后的标识符不能是保留字,比如,o.for或o.class是非法的,因为for是JavaScript的关键字,class是保留字。如果一个对象的属性名是保留字,则必须使用方括号的形式访问它们,比如o[“for”]或o[“class”]。ECMAScript 5对此放宽了限制(包括ECMAScript 3的某些实现),可以在点运算符后直接使用保留字。

3、在以下场景给对象o设置属性p会失败:

  • l  o中的属性p是只读的:不能给只读属性重新赋值(defineProperty()方法中有一个例外,可以对可配置的只读属性重新赋值)。
  • l  o中的属性p是继承属性,且它是只读的:不能通过同名自有属性覆盖只读的继承属性。
  • l  o中不存在自有属性p:o没有使用setter方法继承属性p,并且o的可扩展性(extensible attribute)是false。如果o中不存在p,而且没有setter方法可供调用,则p一定会添加至o中。但如果o不是可扩展的,那么在o中不能定义新属性。

4、delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性。a={p:{x:1}}; b=a.p; delete a.p; 执行这段代码之后b.x的值依然是1.由于已经删除的属性的引用依然存在,因此在JavaScript的某些实现中,可能因为这种不严谨的代码而造成内存泄漏。所以在销毁对象的时候,要遍历属性中的属性,依次删除。

5、所有通过ECMAScript 3的程序创建的属性都是可写的、可枚举的和可配置的,且无法对这些特性做修改。ECMAScript 5中可以查询和设置这些属性特性。

  • l  可以给原型对象添加方法,并将它们设置称不可枚举的,这让它们看起来更像内置方法。
  • l  可以给对象定义不能修改或删除的属性,借此“锁定”这个对象。

6、我们可以认为一个属性包含一个名字和4个特性。数据属性的4个特性分别是它的值(value)、可写性(writable)、可没举行(enumerable)和可配置性(configurable)。存取器属性不具有值(value)特性和可写性,它们的可写性是由setter方法存在与否决定的。因此存取器属性的4个特性是读取(get)、写入(set)、可枚举性和可配置性。

7、任何对Object.defineProperty或Object.defineProperties()违反规则的使用都会抛出类型错误异常:

  • l  如果对象是不可扩展的,则可以编辑已有的自有属性,但不能给它添加新属性。
  • l  如果属性是不可配置的,则不能修改它的可配置性和可枚举性。
  • l  如果存取器属性是不可配置的,则不能修改其getter和setter方法,也不能将它转换为数据属性。
  • l  如果数据属性是不可配置的,则不能将它修改为存取器属性。
  • l  如果数据属性是不可配置的,则不能将它的可写性从false修改为true,但可以从true修改为false。
  • l  如果数据属性是不可配置且不可写的,则不能修改它的值。然而可配置但不可写属性的值是可以修改的(实际上是先将它标记为可写的,然后修改它的值,最后转换为不可写的)。

8、一旦将对象转换为不可扩展的,就无法再将其转换回可扩展的了。同样需要注意的是,preventExtensions()只影响到对象本身的可扩展性。如果给一个不可扩展的对象的原型添加属性,这个不可扩展的对象同样会继承这些新属性。可扩展属性的目的是将对象“锁定”,以避免外界的干扰。

9、JavaScript对象、数组、字符串、无穷大数字、true、fale和null可以序列化和还原。NaN、Infinity和-Infinity序列化的结果是null,日期对象序列化的结果是ISO格式的日期字符串,但JSON.parse()依然保留它们的字符串形态,而不会将它们还原为原始日期对象。函数、RegExp、Error对象和undefined值不能序列化和还原。JSON.stringify()只能序列化对象可枚举的自有属性。对于一个不能序列化的属性来说,在序列化后的输出字符串中会将这个属性忽略掉。