浅谈Object.getPrototypeOf()

这篇博客探讨了JavaScript中的Object.getPrototypeOf()方法,它用于获取对象的原型。文章通过示例展示了如何检查不同类型的变量(字符串、数字、布尔、对象、函数等)的原型,并解释了在ES5和ES6中的行为差异。此外,还提到了如何创建没有原型的对象,以及对Date、Function等内置对象原型的探究。最后,文章通过多个示例展示了各种构造函数和实例的原型关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Object.getPrototypeOf(object)

这个还蛮简单的,返回给定对象的原型。如果没有继承属性,则返回 null 
在ES5中,如果传递给方法的参数不是对象,则会抛出TypeError异常。
在ES6中,如果传递给方法的参数不是对象,则会强制类型转换为对象。

基本用法:

var a = '你好'
console.log(Object.getPrototypeOf(a) === String.prototype)  // true

var b = 5
console.log(Object.getPrototypeOf(b) === Number.prototype)  // true

var c = false
console.log(Object.getPrototypeOf(c) === Boolean.prototype) // true

var d = {}
console.log(Object.getPrototypeOf(d) === Object.prototype)  // true

var e = null
console.log(Object.getPrototypeOf(e))   // TypeError: Cannot convert undefined or null to object

var f = undefined
console.log(Object.getPrototypeOf(f))   // TypeError: Cannot convert undefined or null to object

var g = Symbol('g');
Object.getPrototypeOf(g) === Symbol.prototype;  // true

// 创建一个没有原型对象的对象
var obj = Object.create(null);
Object.getPrototypeOf(obj); // null

console.log(Object.getPrototypeOf(Date) === Date.prototype) // false
console.log(Object.getPrototypeOf(Date()) === String.prototype) // true
console.log(Object.getPrototypeOf(new Date()) === Date.prototype)   // true
console.log(Object.getPrototypeOf(Function) === Function.prototype) // true
console.log(Object.getPrototypeOf(Function()) === Function.prototype)   // true
console.log(Object.getPrototypeOf(new Function()) === Function.prototype)   // true
console.log(Object.getPrototypeOf(Object()) === Object.prototype)   // true
console.log(Object.getPrototypeOf(Object) === Function.prototype)   // true
console.log(Object.getPrototypeOf(new Object()) === Object.prototype)   // true
console.log(Object.getPrototypeOf({}) === Object.prototype) // true
console.log({} == new Object()) // false

### JavaScript 中 `Object.create` 和 `Object.getPrototypeOf` 的用法及区别 #### 一、`Object.create` 的功能与用途 `Object.create(proto[, propertiesObject])` 是用于创建新对象的方法,其第一个参数指定了新对象的原型对象。通过这种方式,可以显式地控制新建对象的原型链。 - **主要作用** 它允许开发者手动构建具有特定原型的对象实例。例如,当需要基于某个现有对象来定义新的行为时,这种方法非常有用[^1]。 - **语法示例** ```javascript const prototypeObj = { greet: function () { return 'Hello!'; } }; const obj = Object.create(prototypeObj); console.log(obj.greet()); // 输出 Hello! ``` 此方法还可以接受第二个可选参数,用来描述额外属性的行为(如配置 getter 或 setter)。如果仅需简单继承而不涉及复杂初始化逻辑,则推荐使用该方式代替传统的构造函数模式[^4]。 --- #### 二、`Object.getPrototypeOf` 的功能与用途 `Object.getPrototypeOf(object)` 返回指定对象的原型 (即内部 [[Prototype]] 属性),它通常被用来查询某对象的实际父级原型是什么。 - **实际应用案例** - 验证给定值是否属于某种内置类型; - 动态调整某些类库中的默认行为; 以下是具体例子展示如何利用这一特性判断字符串类型的原始形式: ```javascript console.log(Object.getPrototypeOf('foo') === String.prototype); // true console.log(Object.getPrototypeOf(true) === Boolean.prototype); // true ``` 上述代码片段展示了对于基本数据类型封装后的访问机制[^2]。 --- #### 三、两者的对比分析 | 特性 | `Object.create()` | `Object.getPrototypeOf()` | |--------------------------|-------------------------------------------|---------------------------------------| | 主要目的 | 创建一个新的对象并设定它的原型 | 获取已有对象的原型 | | 参数数量 | 至少一个 | 只有一个 | | 是否改变原对象结构 | 不会 | 不会 | | 常见应用场景 | 实现简单的单继承或者多层嵌套关系模拟 | 调试程序期间探索复杂的对象图谱 | 值得注意的是,在 ES6 引入 class 关键字之后,虽然可以通过 extends 来简化许多操作流程,但在更底层的操作层面理解这些基础概念仍然非常重要[^3]^。 另外需要注意的一点是关于性能考量方面:频繁调用此类元编程相关的 API 可能会对运行效率造成一定影响;因此除非必要情况下不建议过度依赖它们来进行日常开发工作. --- ### 总结 综上所述,尽管两者都围绕着 JavaScript 的原型系统展开讨论,但各自侧重点完全不同——前者侧重于生产阶段的新实体制造过程管理,后者则更多关注既有资源的信息挖掘能力提升之上。掌握好这两者之间的界限有助于我们更好地运用面向对象的思想去解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值