[英]Why and when to use default export over named exports in es6 Modules?
[英]ES6 Modules - why named const exports are not read only
我一直在閱讀ES模塊和實驗,並偶然發現了一個我無法解釋的案例:
// settings.js
export const FOO = 42;
export const BAR= 5;
// main1.js
import * as settings from './settings';
settings.FOO = 1;
//main2.js
import {FOO, BAR} from './settings'
FOO = 1;
在main1.js
我能夠通過settings
變量覆蓋const
值,但是在main2.js
我不能(如預期的那樣)。
(理論上)問題是為什么在第一種情況下可以覆蓋const
值? 創建“只讀視圖”是否只是在常規對象上創建屬性並破壞原始結構?
實際問題是從模塊返回常量集合(或只讀屬性)的最有效方法是什么? 我的想法是:
// settings.js
export default Object.freeze({
FOO: 42,
BAR: 5
});
有什么想法嗎?
編輯:我正在使用巴別塔。
另一個答案是不正確的。
(理論上)問題是為什么在第一種情況下可以覆蓋const值?
這實際上完全獨立於const
。 使用ES6模塊語法,不允許從模塊外部重新分配模塊的導出值。 export let FOO;
也是如此export let FOO;
或export var FOO;
。 模塊內部的代碼是唯一允許更改導出的內容。
做settings.FOO = 1
技術上應該拋出異常,但是大多數編譯器目前都沒有處理這種特殊的邊緣情況。
舉個例子,你可以做到
export var FOO;
export function setFoo(value){
FOO = value;
}
並且考慮到這一點, 這是const
變得有用的原因,因為它與任何其他普通的JS代碼相同。 如果它被聲明為export const FOO
,則FOO = value
將失敗,因此如果您的模塊導出一堆常量,則執行export const FOO = 1, FOO2 = 2;
導出常量是一種很好的方法,只是Babel實際上並沒有使它們成為不可變的。
在這段代碼中
import * as settings from './settings';
settings.FOO = 1;
在上面的代碼中,您不是直接分配常量變量而是分配settings
的克隆副本。
import * as settings from './settings';
^^^^^^^^^^^^
settings.FOO = 1;
但在下一個代碼中並非如此
import {FOO, BAR} from './settings'
FOO = 1;
這里FOO
和BAR
是常量,你不能分配給它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.