I am trying to create a simple menu toggle functionality with JavaScript. And I am using constructors with functions to achieve it like below:
Constructor with anonymous function:
(function(){
// Constructor
function Menu(selector){
let menu = document.querySelector(selector);
return {
activateToggle: function(){
menu.addEventListener("click", function(){
menu.parentNode.querySelector("ul").classList.toggle("hidden");
});
},
default: function(){
menu.parentNode.querySelector("ul").classList.add("hidden");
}
}
}
let topMenu = new Menu(".burger");
topMenu.default();
topMenu.activateToggle();
let bottomMenu = new Menu(".bottom-burger");
bottomMenu.activateToggle();
})();
.hidden {
display: none;
}
<!--Top Menu-->
<div class="topmenu">
<button class="burger">Top Menu</button>
<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li><li>Item 4</li><li>Item 5</li></ul>
</div>
<!--Bottom Menu-->
<div class="bottommenu">
<button class="bottom-burger">Bottom Menu</button>
<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li><li>Item 4</li><li>Item 5</li></ul>
</div>
Same Menu with arrow function:
(function(){
// Constructor
let Menu = (selector) => {
let menu = document.querySelector(selector);
return {
activateToggle: () => menu.addEventListener("click", () => menu.parentNode.querySelector("ul").classList.toggle("hidden")),
default: () => menu.parentNode.querySelector("ul").classList.add("hidden")
}
}
let topMenu = new Menu(".burger");
topMenu.default();
topMenu.activateToggle();
let bottomMenu = new Menu(".bottom-burger");
bottomMenu.activateToggle();
})();
.hidden {
display: none;
}
<!--Top Menu-->
<div class="topmenu">
<button class="burger">Top Menu</button>
<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li><li>Item 4</li><li>Item 5</li></ul>
</div>
<!--Bottom Menu-->
<div class="bottommenu">
<button class="bottom-burger">Bottom Menu</button>
<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li><li>Item 4</li><li>Item 5</li></ul>
</div>
The above code throws an error "Menu is not a constructor"
. I have tried to find the answer on how to create constructor with arrow functions but most of the article says that we can not use new
keyword with arrow function.
Then what is the correct approach to create constructor with arrow functions?