Freeze a small object when its fields should not change.

freeze-shape `Object.freeze` marks an object as not meant to be changed. Use it for small constant shapes, and still expose scalar values to the rest of the code.

Frozen Shapes

role
freeze_shape.js
Replay: real traced execution (multi-file project)
const role = "viewer";
const label = Object.freeze({ role: role }).role + ":locked";
const canEdit = role !== "viewer";

console.log("label=" + label);
console.log("canEdit=" + canEdit);
const role = "editor";
const label = Object.freeze({ role: role }).role + ":locked";
const canEdit = role !== "viewer";

console.log("label=" + label);
console.log("canEdit=" + canEdit);
const role = "admin";
const label = Object.freeze({ role: role }).role + ":locked";
const canEdit = role !== "viewer";

console.log("label=" + label);
console.log("canEdit=" + canEdit);
  1. role ← viewer, label ← viewer:locked, canEdit ← false

    1const role→ viewer = "viewer"; //@role="editor", "admin"2const label→ viewer:locked = Object.freeze({ role: role→ viewer }).role + ":locked";3const canEdit→ false = role→ viewer !== "viewer";45console.log("label=" + labelviewer:locked);6console.log("canEdit=" + canEditfalse);
    outputlabel=viewer:locked
    canEdit=false
  1. role ← editor, label ← editor:locked, canEdit ← true

    1const role→ editor = "editor";2const label→ editor:locked = Object.freeze({ role: role→ editor }).role + ":locked";3const canEdit→ true = role→ editor !== "viewer";45console.log("label=" + labeleditor:locked);6console.log("canEdit=" + canEdittrue);
    outputlabel=editor:locked
    canEdit=true
  1. role ← admin, label ← admin:locked, canEdit ← true

    1const role→ admin = "admin";2const label→ admin:locked = Object.freeze({ role: role→ admin }).role + ":locked";3const canEdit→ true = role→ admin !== "viewer";45console.log("label=" + labeladmin:locked);6console.log("canEdit=" + canEdittrue);
    outputlabel=admin:locked
    canEdit=true