Skip to content

Bits of .NET

Daily micro-tips for C#, SQL, performance, and scalable backend engineering.

  • Asp.Net Core
  • C#
  • SQL
  • JavaScript
  • CSS
  • About
  • ErcanOPAK.com
  • No Access
  • Privacy Policy
JavaScript

JavaScript: Use Proxy for Object Interception

- 09.07.26 - ErcanOPAK

🛡️ Proxy = Object Interception

Objects are exposed. Proxy intercepts operations. Validation, logging, reactivity, access control.

📝 Proxy Basics

// Basic proxy
const target = { name: 'Alice', age: 30 };
const handler = {
    get: function(obj, prop) {
        console.log(`Getting ${prop}`);
        return obj[prop];
    },
    set: function(obj, prop, value) {
        console.log(`Setting ${prop} to ${value}`);
        obj[prop] = value;
        return true;
    }
};
const proxy = new Proxy(target, handler);
proxy.name; // Logs: Getting name
proxy.age = 31; // Logs: Setting age to 31

// Validation proxy
const userValidator = {
    set: function(obj, prop, value) {
        if (prop === 'age') {
            if (typeof value !== 'number' || value < 0 || value > 120) {
                throw new Error('Invalid age');
            }
        }
        if (prop === 'email') {
            if (!value.includes('@')) {
                throw new Error('Invalid email');
            }
        }
        obj[prop] = value;
        return true;
    }
};
const user = new Proxy({}, userValidator);
user.age = 30; // OK
user.email = 'test@example.com'; // OK
// user.age = -5; // Throws Error

// Read-only proxy
const readOnlyHandler = {
    set: function(obj, prop, value) {
        throw new Error(`Cannot modify ${prop}`);
    }
};
const config = new Proxy({ apiKey: 'secret' }, readOnlyHandler);
// config.apiKey = 'new'; // Throws Error

🎯 Advanced Proxy

// Reactive proxy (Vue-like)
function reactive(obj) {
    return new Proxy(obj, {
        get(target, key) {
            // Track dependency
            track(target, key);
            return target[key];
        },
        set(target, key, value) {
            target[key] = value;
            // Trigger updates
            trigger(target, key);
            return true;
        }
    });
}

// Auto-generate getters/setters
class AutoProxy {
    constructor(target) {
        return new Proxy(target, {
            get: function(obj, prop) {
                if (prop in obj) return obj[prop];
                console.warn(`Property ${prop} doesn't exist`);
                return undefined;
            }
        });
    }
}

💡 Proxy Use Cases

  • Validation
  • Reactivity (Vue, Svelte)
  • API caching
  • Logging
  • Access control

“Proxy enables object interception. Validation, reactivity, logging. Essential for advanced JavaScript.”

— JavaScript Expert

Related posts:

JavaScript Memory Usage Keeps Growing

forEach + async — A Hidden Logic Bug

JavaScript: Use Optional Chaining to Prevent 'Cannot Read Property of Undefined' Errors

Post Views: 2

Post navigation

HTML: Build 2D Games with Canvas
Ajax: Use Server-Sent Events for One-Way Real-Time

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

October 2026
M T W T F S S
 1234
567891011
12131415161718
19202122232425
262728293031  
« Sep    

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (953)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)
  • How to enable, disable and check if Service Broker is enabled on a database in SQL Server (624)
  • Add Constraint to SQL Table to ensure email contains @ (590)
  • Average of all values in a column that are not zero in SQL (553)
  • How to use Map Mode for Vertical Scroll Mode in Visual Studio (526)
  • Find numbers with more than two decimal places in SQL (468)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps
  • Photoshop: Fix a Color Profile Mismatch That Makes Printed Output Look Nothing Like What You Saw On Screen
  • WordPress: Fix Search Results That Return Pages From a Theme You Deactivated Months Ago
  • Visual Studio: Fix a Test Project That Builds Fine Alone but Fails to Discover Any Tests After a NuGet Restore
  • ASP.NET Core: Fix a File Upload That Times Out on Slow Connections Only Because Kestrel’s Minimum Data Rate Feature Kicked In
  • JavaScript: Fix an Array Destructuring Default Value That Silently Never Applies Because null Was Passed Instead of Undefined

Most Viewed Posts

  • Get the User Name and Domain Name from an Email Address in SQL (973)
  • How to make theater mode the default for Youtube (953)
  • How to add default value for Entity Framework migrations for DateTime and Bool (939)
  • Get the First and Last Word from a String or Sentence in SQL (847)
  • How to select distinct rows in a datatable in C# (837)

Recent Posts

  • CSS: Fix a prefers-color-scheme Media Query That Gets Silently Overridden by a Browser Extension’s Forced Dark Mode
  • Git: Fix a Merge Commit That Silently Drops a File Because Both Branches Deleted It Differently
  • HTML5: Fix a Native Lazy-Loading Image That Never Loads Because It Sits Inside a Hidden Tab Until the User Clicks It
  • The AI Prompt That Traces a Null Reference Exception Back to the Exact Line That First Produced the Null
  • The AI Prompt That Turns a Gym Membership Contract’s Fine Print Into a Plain-English List of Cancellation Steps

Social

  • ErcanOPAK.com
  • GoodReads
  • LetterBoxD
  • Linkedin
  • The Blog
  • Twitter
© 2026 Bits of .NET | Built with Xblog Plus free WordPress theme by wpthemespace.com