JavaScript中__proto__疑问:为何无法访问obj1.__proto__.getName?
关于__proto__访问getName的问题解答
你遇到的问题核心是:obj1.__proto__.getName 访问不到,因为 getName 是 obj1 的自有属性,而非它原型链上的属性。
代码调用逻辑拆解
逐个分析你代码里的调用行为:
obj1.getName():正常执行,getName是obj1自身的属性,this指向obj1,输出完整的个人信息。obj2.getName():obj2没有自带getName,会沿着原型链找到obj1的getName,但此时this指向obj2,obj2只有fName属性,所以输出I am Aman undefined from undefined。obj2.__proto__.getName():obj2.__proto__指向obj1,等同于直接调用obj1.getName(),this指向obj1,输出正常信息。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
相关产品推荐
相关产品推荐

