在类的构造函数中定义对象属性报错,求问题原因及其他实现方式
问题分析与解决
你的问题核心出在构造函数的拼写错误上!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
相关产品推荐
相关产品推荐

