JavaScript初始化map时能否引用同map内已定义的属性值?
核心原因
和“常量值不可变更”没有关系,是JavaScript两个基础执行规则导致的:
- 第一,对象字面量的
{}不会创建独立作用域,写在属性值位置的表达式,执行上下文完全取决于外层作用域。如果你这段代码写在全局,这里的this指向全局对象(浏览器环境是window,Node.js环境是globalThis),和你正在创建的对象没有任何关联;如果写在函数内部,this指向的是函数运行时绑定的上下文,同样不是正在构建的目标对象。 - 第二,对象初始化的固定顺序是先逐行计算所有属性的取值,所有属性计算完成后才会生成完整的对象实例,最后再把这个实例赋值给左边的
map常量。也就是说你在计算URL属性值的时间点,目标对象还没创建完成,map常量也还没完成赋值,根本不可能从一个不存在的对象上读取PAGE_ID属性。哪怕你去掉this直接写PAGE_ID也会直接抛ReferenceError——对象属性是挂载在最终生成的对象实例上的,不会注册到当前执行作用域,外层作用域根本找不到名为PAGE_ID的变量。
你可以直接运行示例代码验证,最终
map.URL的值会是https://someUrl.com/?pageId=undefined,本质就是this.PAGE_ID读取的是全局对象上的PAGE_ID属性,而全局并没有定义这个值,拿到的就是undefined。
可选实现方案
如果要实现同对象内关联属性的定义,有两种常用写法:
- 初始化时固定值(符合常量不可变的要求)
先把公共值提取为临时常量,再赋值给对象属性,这种写法下URL在对象创建完成后就是固定字符串,不会随后续属性修改变化:
const PAGE_ID = '<some_string_id_value>'; const map = { PAGE_ID, URL: `https://someUrl.com/?pageId=${PAGE_ID}` };
- 访问时动态计算
如果不想拆分出单独变量,可以给URL定义getter访问器,注意这种写法下URL不会在初始化时固定值,每次访问都会重新计算,如果后续修改map.PAGE_ID,返回的URL也会同步变化,不适合纯常量场景:
const map = { PAGE_ID: '<some_string_id_value>', get URL() { return `https://someUrl.com/?pageId=${this.PAGE_ID}` } };
内容的提问来源于stack exchange,提问作者Noccz
相关产品推荐
相关产品推荐

