{"id":2556,"date":"2024-10-28T17:00:40","date_gmt":"2024-10-28T16:00:40","guid":{"rendered":"https:\/\/codeflarelimited.com\/blog\/?p=2556"},"modified":"2024-10-28T17:19:46","modified_gmt":"2024-10-28T16:19:46","slug":"observer-pattern-in-javascript","status":"publish","type":"post","link":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/","title":{"rendered":"Observer Pattern in JavaScript: Implementing Custom Event Systems"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Introduction<\/h3>\n\n\n\n<p>The <strong>Observer Pattern<\/strong> is a design pattern used to manage and notify multiple objects when the state of an observable object changes. It\u2019s widely used in JavaScript to implement event-driven systems such as event listeners and publish-subscribe (pub\/sub) systems. This article will explain the concept, show how to implement it in JavaScript, and provide real-world examples.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What is the Observer Pattern?<\/h2>\n\n\n\n<p>The Observer Pattern follows a <strong>one-to-many relationship<\/strong> between objects. There\u2019s one subject (observable) that keeps track of its state, and multiple observers waiting for updates. Whenever the subject changes, it notifies all observers.<\/p>\n\n\n\n<p>This pattern is common in:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Event listeners (DOM events)<\/li>\n\n\n\n<li>Reactive programming libraries like <strong>RxJS<\/strong><\/li>\n\n\n\n<li>State management systems such as <strong>Redux<\/strong><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">How the Observer Pattern Works<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Subject (Observable)<\/strong>: Manages state and maintains a list of observers.<\/li>\n\n\n\n<li><strong>Observers<\/strong>: Get notified when the subject\u2019s state changes.<\/li>\n\n\n\n<li><strong>Notification Mechanism<\/strong>: When the state changes, all observers receive an update.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Example: Building a Custom Observer Pattern from Scratch<\/h2>\n\n\n\n<p>Here\u2019s a simple implementation of the Observer Pattern in JavaScript. We\u2019ll create a <code>Subject<\/code> class that allows observers to subscribe, unsubscribe, and receive notifications when something changes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Code Example<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"javascript\" class=\"language-javascript\">\/\/ Subject (Observable) Class\nclass Subject {\n    constructor() {\n        this.observers = []; \/\/ List of observers\n    }\n\n    \/\/ Add an observer\n    subscribe(observer) {\n        this.observers.push(observer);\n        console.log(`Observer subscribed.`);\n    }\n\n    \/\/ Remove an observer\n    unsubscribe(observer) {\n        this.observers = this.observers.filter(obs =&gt; obs !== observer);\n        console.log(`Observer unsubscribed.`);\n    }\n\n    \/\/ Notify all observers about a change\n    notify(data) {\n        console.log(`Notifying observers...`);\n        this.observers.forEach(observer =&gt; observer.update(data));\n    }\n}\n\n\/\/ Observer Class\nclass Observer {\n    constructor(name) {\n        this.name = name;\n    }\n\n    \/\/ Each observer handles updates differently\n    update(data) {\n        console.log(`${this.name} received data: ${data}`);\n    }\n}\n\n\/\/ Usage Example\nconst subject = new Subject(); \/\/ Create a subject\n\nconst observer1 = new Observer('Observer 1'); \/\/ Create observers\nconst observer2 = new Observer('Observer 2');\n\n\/\/ Subscribe observers to the subject\nsubject.subscribe(observer1);\nsubject.subscribe(observer2);\n\n\/\/ Notify all observers with some data\nsubject.notify('New Update Available');\n\n\/\/ Unsubscribe an observer and notify again\nsubject.unsubscribe(observer1);\nsubject.notify('Another Update');\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Explanation<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Subject (Observable)<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Manages a list of observers.<\/li>\n\n\n\n<li>Provides methods to <code>subscribe<\/code>, <code>unsubscribe<\/code>, and <code>notify<\/code> observers.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Observer<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Each observer has a unique name and an <code>update<\/code> method to respond to changes.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Usage<\/strong>:\n<ul class=\"wp-block-list\">\n<li>We create two observers, subscribe them to the subject, and send notifications.<\/li>\n\n\n\n<li>After removing one observer, we notify again to show that only the remaining observer gets the update.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Practical Use Cases of Observer Pattern in JavaScript<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. <strong>DOM Event Listeners<\/strong><\/h3>\n\n\n\n<p>Every time you attach a click event listener to a button, you\u2019re using the observer pattern under the hood. Here&#8217;s how it works:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">const button = document.querySelector('#myButton');\nbutton.addEventListener('click', () =&gt; {\n    console.log('Button clicked!');\n});\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The button is the <strong>subject<\/strong>.<\/li>\n\n\n\n<li>The event listeners are the observers notified when the event occurs.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2. <strong>Custom Event Emitters (Pub\/Sub Model)<\/strong><\/h3>\n\n\n\n<p>JavaScript libraries like Node.js\u2019s <code>EventEmitter<\/code> follow the observer pattern, enabling custom events. Here\u2019s a simplified implementation:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"javascript\" class=\"language-javascript\">class EventEmitter {\n    constructor() {\n        this.events = {};\n    }\n\n    on(event, listener) {\n        if (!this.events[event]) {\n            this.events[event] = [];\n        }\n        this.events[event].push(listener);\n    }\n\n    emit(event, data) {\n        if (this.events[event]) {\n            this.events[event].forEach(listener =&gt; listener(data));\n        }\n    }\n}\n\n\/\/ Usage\nconst emitter = new EventEmitter();\nemitter.on('dataReceived', (data) =&gt; console.log(`Received: ${data}`));\nemitter.emit('dataReceived', 'Hello World!');\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3. <strong>State Management Systems (Redux and MobX)<\/strong><\/h3>\n\n\n\n<p>In <strong>state management libraries<\/strong>, the app\u2019s state is the subject, and components act as observers. When the state changes, the observers (components) update automatically.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Advantages of the Observer Pattern<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Decoupled Components<\/strong>: Observers and subjects don\u2019t need to know about each other\u2019s internals.<\/li>\n\n\n\n<li><strong>Scalable Architecture<\/strong>: Easily add or remove observers without modifying the subject.<\/li>\n\n\n\n<li><strong>Asynchronous Communication<\/strong>: Notifications can happen asynchronously (e.g., using Promises or setTimeout).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Drawbacks of the Observer Pattern<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Memory Leaks<\/strong>: If observers aren\u2019t unsubscribed properly, they can cause memory leaks.<\/li>\n\n\n\n<li><strong>Overhead<\/strong>: Managing many observers can become complex in large-scale applications.<\/li>\n\n\n\n<li><strong>Unexpected Behavior<\/strong>: Errors in observers can affect the entire notification chain.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>The Observer Pattern is a powerful tool for building dynamic, event-driven applications. From simple event listeners to complex state management systems, it plays a crucial role in JavaScript\u2019s ecosystem. By implementing this pattern yourself, you gain a deeper understanding of how frameworks and libraries work behind the scenes.<\/p>\n\n\n\n<p>Whether you&#8217;re working with event-driven UIs, building custom pub\/sub systems, or designing scalable applications, mastering the observer pattern will enhance your JavaScript skills.<\/p>\n\n\n\n<p><a href=\"https:\/\/codeflarelimited.com\/blog\/memory-management-in-javascript\/\">Memory Management in JavaScript<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction The Observer Pattern is a design pattern used to manage and notify multiple objects when the state<\/p>\n","protected":false},"author":3,"featured_media":2558,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[11],"tags":[99],"class_list":["post-2556","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-software-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Observer Pattern in JavaScript<\/title>\n<meta name=\"description\" content=\"Discover how to use the Observer Pattern in JavaScript for event-driven systems and state management with practical examples.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Observer Pattern in JavaScript\" \/>\n<meta property=\"og:description\" content=\"Discover how to use the Observer Pattern in JavaScript for event-driven systems and state management with practical examples.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-10-28T16:00:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-10-28T16:19:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2024\/10\/IMG-20241028-WA0032.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1120\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Kene Samuel\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/observer-pattern-in-javascript\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/observer-pattern-in-javascript\\\/\"},\"author\":{\"name\":\"Kene Samuel\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#\\\/schema\\\/person\\\/c501609bab46c16807eb32106074f206\"},\"headline\":\"Observer Pattern in JavaScript: Implementing Custom Event Systems\",\"datePublished\":\"2024-10-28T16:00:40+00:00\",\"dateModified\":\"2024-10-28T16:19:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/observer-pattern-in-javascript\\\/\"},\"wordCount\":522,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/observer-pattern-in-javascript\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/IMG-20241028-WA0032.jpg\",\"keywords\":[\"software development\"],\"articleSection\":[\"javascript\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/observer-pattern-in-javascript\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/observer-pattern-in-javascript\\\/\",\"url\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/observer-pattern-in-javascript\\\/\",\"name\":\"Observer Pattern in JavaScript\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/observer-pattern-in-javascript\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/observer-pattern-in-javascript\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/IMG-20241028-WA0032.jpg\",\"datePublished\":\"2024-10-28T16:00:40+00:00\",\"dateModified\":\"2024-10-28T16:19:46+00:00\",\"description\":\"Discover how to use the Observer Pattern in JavaScript for event-driven systems and state management with practical examples.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/observer-pattern-in-javascript\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/observer-pattern-in-javascript\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/observer-pattern-in-javascript\\\/#primaryimage\",\"url\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/IMG-20241028-WA0032.jpg\",\"contentUrl\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/IMG-20241028-WA0032.jpg\",\"width\":1120,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/observer-pattern-in-javascript\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"javascript\",\"item\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/javascript\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Observer Pattern in JavaScript: Implementing Custom Event Systems\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/\",\"name\":\"\",\"description\":\"Sustainable solutions\",\"publisher\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#organization\",\"name\":\"Codeflare Limited\",\"url\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/codeflare.png\",\"contentUrl\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/11\\\/codeflare.png\",\"width\":1040,\"height\":263,\"caption\":\"Codeflare Limited\"},\"image\":{\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/#\\\/schema\\\/person\\\/c501609bab46c16807eb32106074f206\",\"name\":\"Kene Samuel\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3e1716cd715a5b5491e1f2da373b52f2f73aeb37d268baff34719116e386d848?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3e1716cd715a5b5491e1f2da373b52f2f73aeb37d268baff34719116e386d848?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3e1716cd715a5b5491e1f2da373b52f2f73aeb37d268baff34719116e386d848?s=96&d=mm&r=g\",\"caption\":\"Kene Samuel\"},\"url\":\"https:\\\/\\\/codeflarelimited.com\\\/blog\\\/author\\\/kene\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Observer Pattern in JavaScript","description":"Discover how to use the Observer Pattern in JavaScript for event-driven systems and state management with practical examples.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/","og_locale":"en_US","og_type":"article","og_title":"Observer Pattern in JavaScript","og_description":"Discover how to use the Observer Pattern in JavaScript for event-driven systems and state management with practical examples.","og_url":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/","article_published_time":"2024-10-28T16:00:40+00:00","article_modified_time":"2024-10-28T16:19:46+00:00","og_image":[{"width":1120,"height":630,"url":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2024\/10\/IMG-20241028-WA0032.jpg","type":"image\/jpeg"}],"author":"Kene Samuel","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/#article","isPartOf":{"@id":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/"},"author":{"name":"Kene Samuel","@id":"https:\/\/codeflarelimited.com\/blog\/#\/schema\/person\/c501609bab46c16807eb32106074f206"},"headline":"Observer Pattern in JavaScript: Implementing Custom Event Systems","datePublished":"2024-10-28T16:00:40+00:00","dateModified":"2024-10-28T16:19:46+00:00","mainEntityOfPage":{"@id":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/"},"wordCount":522,"commentCount":0,"publisher":{"@id":"https:\/\/codeflarelimited.com\/blog\/#organization"},"image":{"@id":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2024\/10\/IMG-20241028-WA0032.jpg","keywords":["software development"],"articleSection":["javascript"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/","url":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/","name":"Observer Pattern in JavaScript","isPartOf":{"@id":"https:\/\/codeflarelimited.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/#primaryimage"},"image":{"@id":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2024\/10\/IMG-20241028-WA0032.jpg","datePublished":"2024-10-28T16:00:40+00:00","dateModified":"2024-10-28T16:19:46+00:00","description":"Discover how to use the Observer Pattern in JavaScript for event-driven systems and state management with practical examples.","breadcrumb":{"@id":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/#primaryimage","url":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2024\/10\/IMG-20241028-WA0032.jpg","contentUrl":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2024\/10\/IMG-20241028-WA0032.jpg","width":1120,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/codeflarelimited.com\/blog\/observer-pattern-in-javascript\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/codeflarelimited.com\/blog\/"},{"@type":"ListItem","position":2,"name":"javascript","item":"https:\/\/codeflarelimited.com\/blog\/javascript\/"},{"@type":"ListItem","position":3,"name":"Observer Pattern in JavaScript: Implementing Custom Event Systems"}]},{"@type":"WebSite","@id":"https:\/\/codeflarelimited.com\/blog\/#website","url":"https:\/\/codeflarelimited.com\/blog\/","name":"","description":"Sustainable solutions","publisher":{"@id":"https:\/\/codeflarelimited.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/codeflarelimited.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/codeflarelimited.com\/blog\/#organization","name":"Codeflare Limited","url":"https:\/\/codeflarelimited.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/codeflarelimited.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2020\/11\/codeflare.png","contentUrl":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2020\/11\/codeflare.png","width":1040,"height":263,"caption":"Codeflare Limited"},"image":{"@id":"https:\/\/codeflarelimited.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/codeflarelimited.com\/blog\/#\/schema\/person\/c501609bab46c16807eb32106074f206","name":"Kene Samuel","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/3e1716cd715a5b5491e1f2da373b52f2f73aeb37d268baff34719116e386d848?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/3e1716cd715a5b5491e1f2da373b52f2f73aeb37d268baff34719116e386d848?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3e1716cd715a5b5491e1f2da373b52f2f73aeb37d268baff34719116e386d848?s=96&d=mm&r=g","caption":"Kene Samuel"},"url":"https:\/\/codeflarelimited.com\/blog\/author\/kene\/"}]}},"jetpack_featured_media_url":"https:\/\/codeflarelimited.com\/blog\/wp-content\/uploads\/2024\/10\/IMG-20241028-WA0032.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/posts\/2556","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/comments?post=2556"}],"version-history":[{"count":1,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/posts\/2556\/revisions"}],"predecessor-version":[{"id":2557,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/posts\/2556\/revisions\/2557"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/media\/2558"}],"wp:attachment":[{"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/media?parent=2556"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/categories?post=2556"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/codeflarelimited.com\/blog\/wp-json\/wp\/v2\/tags?post=2556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}