对象类型

  • 普通对象:拥有 js 对象所有默认的内部行为。
  • 奇异对象:某些方面,内部行为不同于默认行为。
  • 标准对象:标准中定义的对象,可以是普通的,也可以是奇异的。
  • 内置对象:js 运行环境提供的对象。

对象字面量扩展

当对象字面量只有属性名称时,js 引擎会在周边作用域中查找与该名称相同的变量,将变量的值赋给对应的属性。如:

(a, b) => {
  return {
    a,
    b
  };
}

对象的方法可以直接在属性名后面添加 '()' ,这种书写形式(称为方法简写)可以使用 super ,最原始的形式则不能。如:

// 方法名也就是对象的属性名
let obj = {
  // 原始写法
  methodName : function() {
    // body
  }

  methodName() {
    // body
  }
}

如果对象的属性名具有特殊字符,可以使用方括号对其进行引用,不能使用点操作符引用。方括号里面的内容通过计算得出。如:

let tail = " b";
let obj = {
  ["a" + tail] : "xyz",
  ["z" + tail] : "abc"
};
obj["a b"]; // xyz
obj["z b"]; // abc

新方法

Object.is() 方法接收两个参数,只有当两个参数的类型和值同时相同时才返回 true。

Object.is(+0, -0); // false
Object.is(NaN, NaN); // true
Object.is(5, "5"); // false

Object.assign() 方法接收一个 receiver 对象和任意多个 supplier 对象,按照传入的 supplier 对象,将 supplier 对象的属性浅复制给 receiver 对象。若不同的 supplier 对象具有相同的属性而属性值不同时,则该属性最后一个复制的属性值作为 receiver 对象该属性的值,因为前面复制的值被覆盖了。supplier 对象的 get 属性复制之后会成为 receiver 对象的数据属性。

重复的对象字面量属性

对象中如果属性重复,则最后定义的属性值生效。

自有属性枚举顺序

对象的属性枚举时,顺序为:

  1. 按升序排列的数字类型键
  2. 按添加(定义)顺序的字符串类型键
  3. 按添加顺序的符号类型键

for-in 循环、Object.keys() 方法和 JSON.stringify() 方法使用同样的枚举顺序,但没有明确规定顺序。

更强大的原型

对象的原型会在调用构造器或者 Object.create() 方法时确定。
Object.setPrototypeOf() 方法接收两个参数:第一个参数为需要修改原型的对象,第二个参数为取代之前原型的对象。这个方法用于更改对象原型。
原型的值由内部属性 [[Prototype]] 存储,Object.getPrototypeOf() 方法返回该属性存储的值,Object.setPrototypeOf() 方法修改这个值。

在方法简写情况下,方法内部使用的 super 是对当前对象原型的引用。

正式的“方法”定义

以前的 “方法” 表示对象的函数属性,没有正式定义。现在,方法是指有 [[HomeObject]] 内部属性的函数,这个内部属性指向该方法所属的对象。
使用 super 时,会在 [[HomeObject]] 属性上调用 Object.getPrototypeOf() 方法来获得当前对象原型的引用。

参考

[1] Zakas, Understanding ECMAScript 6, 2017.

 posted on 2024-04-28 22:48  x-yun  阅读(6)  评论(0编辑  收藏  举报