JavaScript 对象继承自 Object 的方法总结

类别 方法名 描述 返回值 示例
基本信息方法 toString() 返回对象的字符串表示 String obj.toString() → "[object Object]"
toLocaleString() 返回对象的本地化字符串表示 String obj.toLocaleString() → "[object Object]"
valueOf() 返回对象的原始值 原始值 obj.valueOf() → 对象本身
属性检查方法 hasOwnProperty(property) 检查对象自身是否有该属性(非继承) Boolean obj.hasOwnProperty('name') → true/false
已废弃 propertyIsEnumerable(property) 检查属性是否可枚举且为对象自身属性 Boolean obj.propertyIsEnumerable('name') → true/false
原型链方法 isPrototypeOf(object) 检查对象是否在另一个对象的原型链上 Boolean Parent.prototype.isPrototypeOf(child) → true/false

示例

ES5+ 新增的 Object 静态方法(可通过 Object 调用)

类别 方法名 描述 示例
属性描述符 Object.getOwnPropertyDescriptor() 获取属性描述符 Object.getOwnPropertyDescriptor(obj, 'name')
Object.defineProperty() 定义单个属性 Object.defineProperty(obj, 'name', {value: 'John'})
Object.defineProperties() 定义多个属性 Object.defineProperties(obj, descriptors)
扩展控制 Object.preventExtensions() 防止添加新属性 Object.preventExtensions(obj)
Object.seal() 密封对象(不能添加/删除属性) Object.seal(obj)
Object.freeze() 冻结对象(不能修改) Object.freeze(obj)
状态检查 Object.isExtensible() 检查是否可扩展 Object.isExtensible(obj)
Object.isSealed() 检查是否密封 Object.isSealed(obj)
Object.isFrozen() 检查是否冻结 Object.isFrozen(obj)
属性遍历 Object.keys() 返回对象自身可枚举属性名的数组 Object.keys(obj) → ['name', 'age']
Object.getOwnPropertyNames() 返回对象自身所有属性名的数组 Object.getOwnPropertyNames(obj)
Object.getOwnPropertySymbols() 返回对象自身所有 Symbol 属性的数组 Object.getOwnPropertySymbols(obj)

在 JavaScript 中,所有对象(除了通过 Object.create(null) 创建的)都继承自 Object.prototype,因此可以访问以下方法:

1. 标准继承方法

🔧 对象基本信息方法

// 返回对象的字符串表示
obj.toString()

// 返回对象的本地化字符串表示
obj.toLocaleString()

// 返回对象的原始值
obj.valueOf()

🔍 属性相关方法

// 检查对象自身(非继承)是否有该属性
obj.hasOwnProperty(property)

// 检查属性是否在对象或其原型链中(已废弃,不推荐使用)
obj.propertyIsEnumerable(property)
propertyIsEnumerable()只对自身可枚举属性返回 true

// 检查对象是否在另一个对象的原型链上
obj.isPrototypeOf(object)

2. ES5+ 新增方法

属性描述符方法

// 这些方法实际上定义在 Object 构造函数上,但所有对象都可以访问
Object.getOwnPropertyDescriptor(obj, property)
Object.defineProperty(obj, property, descriptor)
Object.defineProperties(obj, descriptors)

扩展控制方法

Object.preventExtensions(obj)    // 防止添加新属性
Object.seal(obj)                 // 密封对象(不能添加/删除属性)
Object.freeze(obj)              // 冻结对象(不能修改)

Object.isExtensible(obj)        // 检查是否可扩展
Object.isSealed(obj)            // 检查是否密封
Object.isFrozen(obj)            // 检查是否冻结

实际使用示例

function Person(name) {
    this.name = name;
}

const person = new Person("Alice");

// 继承的方法使用
console.log(person.toString());        // [object Object]
console.log(person.hasOwnProperty('name')); // true

// 自定义 toString
Person.prototype.toString = function() {
    return `Person: ${this.name}`;
};

console.log(person.toString()); // Person: Alice

特殊情况

// 通过 Object.create(null) 创建的对象不继承任何方法
const bareObject = Object.create(null);

console.log(bareObject.toString); // undefined
console.log(bareObject.hasOwnProperty); // undefined

// 需要手动添加需要的方法
bareObject.toString = Object.prototype.toString;

注意事项

  • ✅ 所有对象(除 Object.create(null) 创建的)都继承这些方法

  • ⚠️ 这些方法可以被重写

  • 🔧 使用 hasOwnProperty 时如被重写,可用:Object.prototype.hasOwnProperty.call(obj, property)

这些继承的方法为 JavaScript 对象提供了基础的功能支持,是理解 JavaScript 原型链和对象模型的关键。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐