Object常用方法实例

132 阅读2分钟

JavaScript 中的 Object 是所有其他对象的基础原型。Object 对象提供了一些非常有用的静态方法和原型方法,用于操作和检查对象。下面列出了一些常用的 Object 方法,并提供了详细的代码示例和说明。

1. Object.create()

用途:创建一个新对象,使用现有的对象来提供新创建的对象的原型链。

示例

const personPrototype = {
  greet: function() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

const person = Object.create(personPrototype);
person.name = "John Doe";

person.greet();  // 输出: Hello, my name is John Doe

2. Object.defineProperty()

用途:直接在一个对象上定义一个新的属性或修改一个现有属性,并返回该对象。

示例

const person = {};

Object.defineProperty(person, 'name', {
  value: 'John Doe',
  writable: true,
  enumerable: true,
  configurable: true
});

console.log(person.name);  // 输出: John Doe

3. Object.getOwnPropertyDescriptor()

用途:返回指定对象上一个自有属性的描述符。

示例

const person = {
  name: 'John Doe'
};

const descriptor = Object.getOwnPropertyDescriptor(person, 'name');

console.log(descriptor);  // 输出: { value: 'John Doe', writable: true, enumerable: true, configurable: true }

4. Object.keys(), Object.values(), Object.entries()

用途:分别返回对象的所有自身属性的键、值和键值对数组。

示例

const person = {
  name: 'John Doe',
  age: 30
};

console.log(Object.keys(person));  // 输出: ['name', 'age']
console.log(Object.values(person));  // 输出: ['John Doe', 30]
console.log(Object.entries(person));  // 输出: [['name', 'John Doe'], ['age', 30]]

5. Object.assign()

用途:将所有可枚举的属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

示例

const person = {
  name: 'John Doe'
};

const details = {
  age: 30,
  gender: 'male'
};

const combined = Object.assign({}, person, details);

console.log(combined);  // 输出: { name: 'John Doe', age: 30, gender: 'male' }

6. Object.freeze()

用途:冻结一个对象。冻结后的对象不能再被扩展;不能添加新的属性;已存在的属性也不能被删除;已存在的数据描述符属性不能被重新配置或修改其属性值。

示例

const person = {
  name: 'John Doe'
};

const frozenPerson = Object.freeze(person);

frozenPerson.name = 'Jane Doe';  // 尝试修改,但不会成功
console.log(frozenPerson.name);  // 输出: John Doe

7. Object.is()

用途:确定两个值是否为同一个值。对于 NaN 和 -0 这样的特殊情况,Object.is 提供了更准确的比较。

示例

console.log(Object.is(NaN, NaN));  // 输出: true
console.log(Object.is(-0, 0));  // 输出: false

8. Object.setPrototypeOf()

用途:设置一个对象的原型([[Prototype]])到另一个对象或 null。

示例

const personPrototype = {
  greet: function() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

const person = {};

Object.setPrototypeOf(person, personPrototype);
person.name = "John Doe";

person.greet();  // 输出: Hello, my name is John Doe

9. Object.getPrototypeOf()

用途:返回指定对象的原型([[Prototype]])。

示例

const personPrototype = {
  greet: function() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

const person = Object.create(personPrototype);
person.name = "John Doe";

const prototype = Object.getPrototypeOf(person);

console.log(prototype === personPrototype);  // 输出: true

10. Object.hasOwnProperty()

用途:返回一个布尔值,指示对象是否有指定的自有属性。

示例

const person = {
  name: 'John Doe'
};

console.log(person.hasOwnProperty('name'));  // 输出: true
console.log(person.hasOwnProperty('age'));  // 输出: false

除了之前提到的方法之外,JavaScript 的 Object 对象还提供了许多其他有用的方法。下面是一些额外的方法及其用途和示例:

11. Object.getOwnPropertyDescriptor()

用途:返回指定对象上一个自有属性的描述符。

示例

const person = {
  name: 'John Doe'
};

const descriptor = Object.getOwnPropertyDescriptor(person, 'name');

console.log(descriptor);  // 输出: { value: 'John Doe', writable: true, enumerable: true, configurable: true }

12. Object.getOwnPropertyNames()

用途:返回一个由指定对象的所有自身属性的属性名组成的数组。

示例

const person = {
  name: 'John Doe',
  age: 30
};

const names = Object.getOwnPropertyNames(person);

console.log(names);  // 输出: ['name', 'age']

13. Object.getOwnPropertySymbols()

用途:返回一个由指定对象的所有自身属性的符号键组成的数组。

示例

const symbolKey = Symbol('secret');
const person = {
  name: 'John Doe',
  [symbolKey]: 'Secret information'
};

const symbols = Object.getOwnPropertySymbols(person);

console.log(symbols);  // 输出: [Symbol(secret)]

14. Object.getPrototypeOf()

用途:返回指定对象的原型。

示例

const personPrototype = {
  greet: function() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

const person = Object.create(personPrototype);
person.name = "John Doe";

const prototype = Object.getPrototypeOf(person);

console.log(prototype === personPrototype);  // 输出: true

15. Object.setPrototypeOf()

用途:设置一个对象的原型([[Prototype]])到另一个对象或 null。

示例

const personPrototype = {
  greet: function() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

const person = {};

Object.setPrototypeOf(person, personPrototype);
person.name = "John Doe";

person.greet();  // 输出: Hello, my name is John Doe

16. Object.isFrozen()

用途:返回一个布尔值,指示对象是否已经被冻结。

示例

const person = {
  name: 'John Doe'
};

const frozenPerson = Object.freeze(person);

console.log(Object.isFrozen(person));  // 输出: true

17. Object.isSealed()

用途:返回一个布尔值,指示对象是否已经被密封。

示例

const person = {
  name: 'John Doe'
};

const sealedPerson = Object.seal(person);

console.log(Object.isSealed(person));  // 输出: true

18. Object.preventExtensions()

用途:阻止一个对象添加新的属性。

示例

const person = {
  name: 'John Doe'
};

Object.preventExtensions(person);

try {
  person.age = 30;  // 尝试添加新属性
} catch (e) {
  console.log(e.message);  // 输出: Cannot add property age, object is not extensible
}

19. Object.isExtensible()

用途:返回一个布尔值,指示对象是否可以添加新的属性。

示例

const person = {
  name: 'John Doe'
};

const extendedPerson = Object.preventExtensions(person);

console.log(Object.isExtensible(person));  // 输出: false

20. Object.seal()

用途:密封一个对象。密封后的对象不能再被扩展;不能添加新的属性;已存在的属性也不能被删除;但已存在的数据描述符属性可以被重新配置或修改其属性值。

示例

const person = {
  name: 'John Doe'
};

const sealedPerson = Object.seal(person);

try {
  delete person.name;  // 尝试删除属性
} catch (e) {
  console.log(e.message);  // 输出: Cannot delete property 'name' of #<Object>
}

21. Object.keys()

用途:返回一个由一个对象自身的可枚举属性名组成的数组。

示例

const person = {
  name: 'John Doe',
  age: 30
};

const keys = Object.keys(person);

console.log(keys);  // 输出: ['name', 'age']

22. Object.values()

用途:返回一个由一个对象自身的可枚举属性值组成的数组。

示例

const person = {
  name: 'John Doe',
  age: 30
};

const values = Object.values(person);

console.log(values);  // 输出: ['John Doe', 30]

23. Object.entries()

用途:返回一个由一个对象自身的可枚举属性的 [key, value] 对组成的数组。

示例

const person = {
  name: 'John Doe',
  age: 30
};

const entries = Object.entries(person);

console.log(entries);  // 输出: [['name', 'John Doe'], ['age', 30]]

总结

这些方法提供了强大的工具来操作和检查 JavaScript 中的对象。通过使用这些方法,你可以更好地理解和控制对象的行为。这些方法对于编写复杂的应用程序尤其有用,尤其是在需要处理大量的数据和对象的情况下。