为何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
相关产品推荐
相关产品推荐

