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

JavaScript中__proto__疑问:为何无法访问obj1.__proto__.getName?

关于__proto__访问getName的问题解答

你遇到的问题核心是:obj1.__proto__.getName 访问不到,因为 getName 是 obj1 的自有属性,而非它原型链上的属性。

代码调用逻辑拆解

逐个分析你代码里的调用行为:

  1. obj1.getName():正常执行,getName 是 obj1 自身的属性,this 指向 obj1,输出完整的个人信息。
  2. obj2.getName():obj2 没有自带 getName,会沿着原型链找到 obj1 的 getName,但此时 this 指向 obj2,obj2 只有 fName 属性,所以输出 I am Aman undefined from undefined。
  3. obj2.__proto__.getName():obj2.__proto__ 指向 obj1,等同于直接调用 obj1.getName(),this 指向 obj1,输出正常信息。
  4. obj1.__proto__.getName():报错的原因是,字面量创建的对象(比如 obj1)默认原型是 Object.prototype,而 Object.prototype 上并没有你定义的 getName 方法——getName 是挂在 obj1 自身上的,不是它原型的属性,自然找不到。

如何让 obj1.__proto__.getName 可访问

如果想让 getName 出现在 obj1 的原型上,需要把方法定义在 obj1 的原型对象里,而非 obj1 自身。比如用 Object.create 创建继承关系:

// 先定义原型对象,包含getName方法
let baseObj = {
  getName: function(){
    console.log(`I am ${this.fName} ${this.lName} from ${this.city}`)
  }
}

// 创建obj1,让它的原型指向baseObj
let obj1 = Object.create(baseObj, {
  fName: { value: 'Ayush' },
  lName: { value: 'Singh' },
  city: { value: 'Asansol' }
})

let obj2 = { fName: 'Aman' }
obj2.__proto__ = obj1

// 此时obj1.__proto__就是baseObj,能访问getName
obj1.__proto__.getName.call(obj1) // 绑定this到obj1,输出正常信息
obj1.getName() // this默认指向obj1,输出正常

关键知识点

  • 自有属性 vs 原型属性:直接给对象赋值的属性是自有属性,原型链上的属性是从父对象继承来的。你原来的代码里,getName 是 obj1 的自有属性,不是它原型的属性。
  • 默认原型指向:字面量创建的对象,__proto__ 默认指向 Object.prototype,只有显式设置(比如 obj2.__proto__ = obj1)才会指向自定义对象。

内容的提问来源于stack exchange,提问作者ayush singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:35:19