首页 > 解决方案 > 一个对象的一个​​类,它从同一对象的两个其他类接收数据

问题描述

我想创建一个对象,其中该类使用同一对象的其他两个类的数据。

const MatchReplace = {
    Username: {
        RegExp: new RegExp('%USERNAME%', 'g'), // Joined user name
        Value: 'DareFox'
    },
    UserWithTag: {
        RegExp: new RegExp('%USERWITHTAG%', 'g'), // User#XXXX
        Value: 'DareFox#0100'
    },
    ServerName: {
        RegExp: new RegExp('%SERVERNAME%', 'g'), // Name of this server
        Value: 'StackOverflow'
    },
    MemberCount: {
        RegExp: new RegExp('%MEMBERCOUNT%', 'g'), // Member count (human & bots)
        Value: '1005'
    },
    HumanCount: {
        RegExp: new RegExp('%HUMANCOUNT%', 'g'), // Only human count
        Value: '1000'
    },
    BotCount: {
        RegExp: new RegExp('%BOTCOUNT%', 'g'), // Only bot count
        Value: MatchReplace.MemberCount.Value - MatchReplace.HumanCount.Value // Expected: 5
    }
}

但我收到一个错误:

Value: MatchReplace.MemberCount.Value - MatchReplace.HumanCount.Value
               ^

ReferenceError: Cannot access 'MatchReplace' before initialization

为什么这不起作用以及如何使它起作用?

标签: javascriptobject

解决方案


它不起作用,因为当您创建对象时,JS 会初始化每个属性,并且由于对象尚未初始化并且您在其属性之一中有对它的引用,因此无法完成。

您可以通过三种方式进行:

  1. 在对象之前定义值。
  2. 初始化对象,然后以正确的顺序一一分配其属性。
  3. 使用函数或 getter 定义值:
const matchReplace = {
 //...
 BotCount: {
       RegExp: new RegExp('%BOTCOUNT%', 'g'), // Only bot count
       get Value() {return MatchReplace.MemberCount.Value - MatchReplace.HumanCount.Value; } // Expected: 5
   }
}

推荐阅读