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

JavaScript中关联构造函数并原型继承后,如何访问继承属性?

解决JS原型继承中无法访问父类属性的问题

嘿,看来你踩了原型继承里一个很常见的新手坑!我来帮你拆解清楚问题出在哪,以及怎么解决。

问题根源

你写的sample1.prototype = sample2;是把构造函数sample2本身赋值给了sample1的原型,但sample2里的this.age = 21是在调用new sample2()时,才会给新创建的实例对象添加age属性——sample2这个函数对象本身并没有age属性,所以你的test实例自然找不到它。

简单说:你把“构造函数”当成了“构造函数的实例”来用,原型链上根本没有age这个属性。

正确的解决方案

方案1:用构造函数实例作为原型

把sample1的原型指向sample2的实例,这样test的原型链上就会包含带有age属性的sample2实例:

function sample1() { this.uname = "Andrew"; }
function sample2() { this.age = 21; }

// 核心修改:让sample1的原型是sample2的实例
sample1.prototype = new sample2();
// 可选但推荐:修正constructor指向(避免后续判断实例构造函数时出错)
sample1.prototype.constructor = sample1;

let test = new sample1();
console.log(test.uname); // 输出 "Andrew"
console.log(test.age); // 输出 21

此时test的原型链是:test → sample2实例 → sample2.prototype → Object.prototype,sample2实例上存在age属性,所以test能正常访问。

方案2:用ES6 Class语法(更直观)

如果你用的是现代浏览器环境,推荐用Class语法糖来实现继承,逻辑更清晰,不容易出错:

class sample2 {
  constructor() {
    this.age = 21;
  }
}

class sample1 extends sample2 {
  constructor() {
    super(); // 必须调用super()初始化父类构造函数,才能访问this
    this.uname = "Andrew";
  }
}

let test = new sample1();
console.log(test.uname); // 输出 "Andrew"
console.log(test.age); // 输出 21

extends本质还是基于原型链实现的,但语法更贴近面向对象的直觉,super()会帮你调用父类的构造函数,从而给实例添加上age属性。

内容的提问来源于stack exchange,提问作者Panther Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:44:03