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

在类的构造函数中定义对象属性报错,求问题原因及其他实现方式

问题分析与解决

你的问题核心出在构造函数的拼写错误上!JavaScript 里类的构造函数必须是小写开头的constructor,但你写成了大写的Constructor——这会被当成一个普通的类方法,而不是会自动执行的构造函数。所以当你用new Currency()创建实例时,这些属性初始化代码根本没运行,实例自然没有marketBTC属性,访问a.marketBTC.ask就会抛出"Cannot read property 'ask' of undefined"的错误。

修正后的代码

只需要把Constructor改成小写的constructor就能正常运行:

class Currency {
  constructor() { // 这里改成小写开头的constructor
    /* Properties */
    this.ticker = null;
    this.name = null;
    /* Markets availability */
    this.marketBTC = { availability: true, ask: 0.010, bid: 0.009, last: 0.010 };
  }
}
var a = new Currency();
console.log(a.marketBTC.ask); // 现在会输出0.010

其他实现方式

除了传统构造函数初始化,还有几种更简洁灵活的方式可以给类实例添加属性:

1. ES6+类字段语法

直接在类顶层定义实例属性,省去构造函数的包裹,代码更直观:

class Currency {
  // 直接声明实例属性
  ticker = null;
  name = null;
  marketBTC = { availability: true, ask: 0.010, bid: 0.009, last: 0.010 };
}
var a = new Currency();
console.log(a.marketBTC.ask); // 输出0.010

2. 工厂函数

如果不需要类的继承等特性,用工厂函数创建对象更简单,还能避开类的语法陷阱:

function createCurrency() {
  return {
    ticker: null,
    name: null,
    marketBTC: { availability: true, ask: 0.010, bid: 0.009, last: 0.010 }
  };
}
var a = createCurrency();
console.log(a.marketBTC.ask); // 输出0.010

3. 带参数的构造函数(扩展用法)

如果需要创建不同配置的Currency实例,可以给构造函数添加参数,让初始化更灵活:

class Currency {
  constructor(ticker = null, name = null, marketBTC = { availability: true, ask: 0.010, bid: 0.009, last: 0.010 }) {
    this.ticker = ticker;
    this.name = name;
    this.marketBTC = marketBTC;
  }
}
// 创建自定义配置的实例
var btc = new Currency('BTC', 'Bitcoin', { availability: true, ask: 45000, bid: 44900, last: 44950 });
console.log(btc.marketBTC.ask); // 输出45000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:22:46