JavaScript Object 方法

ECMAScript 5 向 JavaScript 添加了许多新的对象方法,包括:添加修改属性、获取属性的元数据、获取属性列表、修改对象配置等。

ECMAScript 5 向 JavaScript 添加了许多新的对象方法,包括:添加修改属性、获取属性的元数据、获取属性列表、修改对象配置等。

这些实用的方法主要包括:

  • Object.defineProperty(object, property, descriptor): 添加或修改一个对象属性
  • Object.defineProperties(object, descriptors): 添加或修改多个对象属性
  • Object.getOwnPropertyDescriptor(object, property): 返回对象上一个自有属性对应的属性描述符
  • Object.getOwnPropertyNames(object): 返回一个包含所有自身属性的数组
  • Object.keys(object): 返回对象的自身可枚举属性组成的数组
  • Object.getPrototypeOf(object): 返回指定对象的原型
  • Object.preventExtensions(object): 让一个对象不可扩展,也就是不能再添加新的属性
  • Object.isExtensible(object): 判断一个对象是否是可扩展的
  • Object.seal(object): 封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置
  • Object.isSealed(object): 判断一个对象是否被封闭
  • Object.freeze(object): 冻结一个对象,一个被冻结的对象再也不能被修改
  • Object.isFrozen(object): 判断一个对象是否被冻结

更改属性值

语法:

Object.defineProperty(object, property, { value: newValue });

此示例更改属性值:

const person = {
  firstName: "John",
  lastName: "Doe",
  language: "EN",
};

// Change a property
Object.defineProperty(person, "language", { value: "NO" });

更改属性元数据

ES5 允许更改属性的元数据:属性是否可写,是否可枚举,是否可配置。

writable: true; // 属性值可被修改
writable: false; // 属性值不可被修改

enumerable: true; // 属性值可被枚举
enumerable: false; // 属性值不可被枚举

configurable: true; // 属性值可被配置
configurable: false; // 属性值不可被配置

此示例使 language 成为只读:

Object.defineProperty(person, "language", { writable: false });

这个例子使 language 属性不可枚举:

Object.defineProperty(person, "language", { enumerable: false });

添加属性

Object.defineProperty() 指定的属性名不存在时,就会作为新属性添加到对象中。

此示例向对象添加新属性:

const person = {
  firstName: "John",
  lastName: "Doe",
  language: "EN",
};

// 添加一个属性
Object.defineProperty(person, "year", { value: "2008" });

添加 Getter 和 Setter

Object.defineProperty() 方法还可用于添加访问器属性:

const person = { firstName: "John", lastName: "Doe" };

// 定义一个 getter
Object.defineProperty(person, "fullName", {
  get: function () {
    return this.firstName + " " + this.lastName;
  },
});

列出所有属性

Object.getOwnPropertyNames() 返回一个数组,数组元素是对象的所有属性,包括不可枚举的属性。

这个例子列出了一个对象的所有属性:

const person = {
  firstName: "John",
  lastName: "Doe",
  language: "EN",
};

Object.defineProperty(person, "language", { enumerable: false });
Object.getOwnPropertyNames(person); // 返回一个属性名的数组

列出可枚举的属性

Object.keys() 返回一个数组,数组元素对象的可枚举属性。

此示例仅列出对象的可枚举属性:

const person = {
  firstName: "John",
  lastName: "Doe",
  language: "EN",
};

Object.defineProperty(person, "language", { enumerable: false });
Object.keys(person); // 返回一个可枚举属性名的数组