You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JS实例未继承Object?调用e.hasOwn报类型错误的原因?

关于JavaScript原型与hasOwn方法的两个问题解答

疑问1:为何该实例未继承自Object?

你存在一个误解:new test1()创建的实例e完全继承自Object。

JavaScript中,除了Object.create(null)生成的无原型对象,所有普通对象的原型链最终都会指向Object.prototype。e的原型是test1.prototype,而test1.prototype本身就是Object的实例(默认构造函数的原型对象都继承自Object.prototype),所以e的完整原型链是:e → test1.prototype → Object.prototype → null,本质上还是Object的派生对象。

疑问2:既然所有对象都继承自Object,为何执行e.hasOwn(...)会报错?

Uncaught TypeError: e.hasOwn is not a function

核心原因是:hasOwn是Object的静态方法,不是挂载在Object.prototype上的实例方法——它不参与原型链的继承,所以普通对象实例(比如e)根本没有这个方法,自然调用会报错。

对比你熟悉的hasOwnProperty:它是挂载在Object.prototype上的实例方法,所以所有继承自Object的对象都能调用。但hasOwn作为hasOwnProperty的官方替代方案,被设计成了静态方法,必须通过Object.hasOwn()的形式调用。

看你的代码示例:

// 正确:通过Object调用静态方法,检查test1.prototype自身是否有eu属性
console.log(Object.hasOwn(test1.prototype, "eu")); 
// 错误:实例e上不存在hasOwn方法
console.log(e.hasOwn(test1.prototype, "eu")); 

如果要检查对象的自身属性,正确的用法是把目标对象作为Object.hasOwn的第一个参数:

// 检查test1.prototype自身的eu属性
console.log(Object.hasOwn(test1.prototype, "eu")); // 输出true
// 检查实例e自身的senha属性
console.log(Object.hasOwn(e, "senha")); // 输出true

内容的提问来源于stack exchange,提问作者Lynera pintcho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:50:27