在 JavaScript 中,Object 对象和 Symbol 类型都提供了一些方法。下面是 Object 和 Symbol 对象的常用方法列表,并且指出每个方法是否可以通过原型链查找,以及提供使用方法:
Object 对象的方法:
-
Object.assign(target, ...sources):可以原型链查找。用于将一个或多个源对象的属性复制到目标对象target中。- 示例:
const target = {}; const source = { name: 'John', age: 30 }; Object.assign(target, source); console.log(target); // { name: 'John', age: 30 }
- 示例:
-
Object.create(proto, [propertiesObject]):不可以原型链查找。通过指定的原型对象proto创建一个新对象。- 示例:
const personProto = { greeting() { console.log('Hello!'); } }; const john = Object.create(personProto); john.greeting(); // Hello!
- 示例:
-
Object.defineProperties(obj, props):不可以原型链查找。定义或修改对象的多个属性。- 示例:
const obj = {}; Object.defineProperties(obj, { name: { value: 'John', writable: true }, age: { value: 30, writable: false } }); console.log(obj.name); // John console.log(obj.age); // 30
- 示例:
-
Object.defineProperty(obj, prop, descriptor):不可以原型链查找。定义或修改对象的指定属性。- 示例:
const obj = {}; Object.defineProperty(obj, 'name', { value: 'John', writable: true }); console.log(obj.name); // John
- 示例:
-
Object.entries(obj):可以原型链查找。返回一个给定对象的可枚举属性键值对的数组。- 示例:
const obj = { name: 'John', age: 30 }; const entries = Object.entries(obj); console.log(entries); // [ ['name', 'John'], ['age', 30] ]
- 示例:
-
Object.freeze(obj):不可以原型链查找。冻结对象,防止修改现有属性或添加新属性。- 示例:
const obj = { name: 'John', age: 30 }; Object.freeze(obj); obj.name = 'Jane'; // 修改被禁止 obj.gender = 'Male'; // 添加被禁止 console.log(obj); // { name: 'John', age: 30 }
- 示例:
-
Object.getOwnPropertyDescriptors(obj):不可以原型链查找。返回指定对象所有属性的属性描述符。- 示例:
const obj = { name: 'John', age: 30 }; const descriptors = Object.getOwnPropertyDescriptors(obj); console.log(descriptors.name); // { value: 'John', writable: true, enumerable: true, configurable: true }
- 示例:
-
Object.getOwnPropertyNames(obj):不可以原型链查找。返回一个数组,包含对象的所有自有属性,包括不可枚举属性。- 示例:
const obj = { name: 'John', age: 30 }; const propertyNames = Object.getOwnPropertyNames(obj); console.log(propertyNames); // [ 'name', 'age' ]
- 示例:
-
Object.getOwnPropertySymbols(obj):不可以原型链查找。返回一个数组,包含对象的所有自有 Symbol 类型的属性。- 示例:
const id = Symbol('id'); const obj = { [id]: 42 }; const symbols = Object.getOwnPropertySymbols(obj); console.log(symbols); // [ Symbol(id) ]
- 示例:
-
Object.getPrototypeOf(obj):不可以原型链查找。返回指定对象的原型。
- 示例:
const personProto = { name: 'John', age: 30 }; const john = Object.create(personProto); console.log(Object.getPrototypeOf(john)); // { name: 'John', age: 30 }
Object.is(value1, value2):不可以原型链查找。判断两个值是否相同(类似于严格相等运算符===),返回一个布尔值。
- 示例:
console.log(Object.is(1, 1)); // true console.log(Object.is({}, {})); // false console.log(Object.is(null, null)); // true
Object.isExtensible(obj):不可以原型链查找。判断对象是否可扩展。
- 示例:
const obj = {}; console.log(Object.isExtensible(obj)); // true Object.preventExtensions(obj); console.log(Object.isExtensible(obj)); // false
Object.isFrozen(obj):不可以原型链查找。判断对象是否被冻结。
- 示例:
const obj = { name: 'John', age: 30 }; console.log(Object.isFrozen(obj)); // false Object.freeze(obj); console.log(Object.isFrozen(obj)); // true
Object.isSealed(obj):不可以原型链查找。判断对象是否被密封。
- 示例:
const obj = { name: 'John', age: 30 }; console.log(Object.isSealed(obj)); // false Object.seal(obj); console.log(Object.isSealed(obj)); // true
Object.keys(obj):可以原型链查找。返回一个数组,包含对象的所有可枚举属性的名称。
- 示例:
const obj = { name: 'John', age: 30 }; const keys = Object.keys(obj); console.log(keys); // [ 'name', 'age' ]
Object.preventExtensions(obj):不可以原型链查找。阻止对象的扩展,使其不可添加新属性。
- 示例:
const obj = { name: 'John', age: 30 }; Object.preventExtensions(obj); obj.gender = 'Male'; // 添加被禁止 console.log(obj); // { name: 'John', age: 30 }
Object.seal(obj):不可以原型链查找。密封对象,防止添加新属性,但允许修改和删除属性。
- 示例:
const obj = { name: 'John', age: 30 }; Object.seal(obj); obj.name = 'Jane'; // 可以修改 delete obj.age; // 可以删除 console.log(obj); // { name: 'Jane' }
Object.setPrototypeOf(obj, prototype):不可以原型链查找。设置对象的原型(prototype)。
- 示例:
const personProto = { name: 'John', age: 30 }; const john = { occupation: 'Developer' }; Object.setPrototypeOf(john, personProto); console.log(john.name); // John
Symbol 对象的方法:
-
Symbol.for(key):不可以原型链查找。根据提供的 key 获取或创建一个全局共享的 symbol。- 示例:
const sym1 = Symbol.for('key'); const sym2 = Symbol.for('key'); console.log(sym1 === sym2); // true
- 示例:
-
Symbol.keyFor(sym):不可以原型链查找。返回与指定的 symbol 关联的键。- 示例:
const sym = Symbol.for('key'); const key = Symbol.keyFor(sym); console.log(key); // key
- 示例:
这里列出了一些常见的 Object 和 Symbol 的方法,并提供了简单的使用示例。需要注意的是,某些方法只能在特定的 JavaScript 环境中使用,并且能否通过原型链查找取决于方法是否定义在 Object.prototype 或 Symbol.prototype 上。