Question 33
Question
How would you create a custom symbol registry to prevent collision of Symbol values?
Answer
While the Symbol()
function generates unique symbols in most cases, creating a custom symbol registry can be beneficial for specific scenarios where you need finer control and predictability over symbol assignments.
Here's how you could implement a basic custom symbol registry:
class SymbolRegistry {
constructor() {
this.symbols = {}; // Map to store registered symbols
}
register(name) {
if (!this.hasSymbol(name)) {
const symbol = Symbol(name);
this.symbols[name] = symbol;
return symbol;
} else {
console.warn(`Symbol '${name}' already exists in the registry`);
return this.symbols[name];
}
}
hasSymbol(name) {
return !!this.symbols[name];
}
getSymbol(name) {
return this.symbols[name];
}
}
// Usage Example:
const registry = new SymbolRegistry();
const mySymbol1 = registry.register('data');
const mySymbol2 = registry.register('view');
console.log(mySymbol1); // Output unique symbol for 'data'
console.log(registry.getSymbol('data')); // Accessing the registered symbol
Explanation:
SymbolRegistry Class: We create a class to manage our symbols. It has a
symbols
map to store registered symbols using names as keys.register(name)
Method:Checks if a symbol with the given
name
already exists in the registry.If not, it generates a new symbol using
Symbol(name)
and stores it in thesymbols
map, returning the newly created symbol.
hasSymbol(name)
Method:Checks if a symbol with the given
name
is present in the registry.
getSymbol(name)
Method:Returns the previously registered symbol associated with the given
name
.
Benefits of Using a Symbol Registry:
Controlled Namespace: Ensures that symbols used within your application are unique and avoid collisions, even across different modules or components.
Readability and Maintainability: Makes it easier to understand which symbols represent specific concepts in your code.
Testability: You can easily mock or stub symbol values during testing.
Last updated