Proxy and ReflectBaseline · Widely available
The Proxy and Reflect JavaScript built-ins intercept and define custom behavior for fundamental language operations (such as property lookup, assignment, enumeration, or function invocation).
Supported in all major browsers for at least 30 months — safe to use without fallbacks. Baseline since Sep 20, 2016. Widely available since Mar 20, 2019.
Browser support
DesktopChrome
1–48Not supported
49+Supportedsince Mar 2, 2016
Current: 155Edge
12+Supportedsince Jul 29, 2015
Current: 154Firefox
1–17Not supported
18+Supportedsince Jan 8, 2013
Current: 157Safari
1–9.1Not supported
10+Supportedsince Sep 20, 2016
Current: 27MobileChrome Android
18–48Not supported
49+Supportedsince Mar 9, 2016
Current: 155Firefox Android
4–17Not supported
18+Supportedsince Jan 8, 2013
Current: 157Safari iOS
1–9.3Not supported
10+Supportedsince Sep 13, 2016
Current: 27How to use
This feature is Baseline widely available — use it freely, no fallback needed.
Example
Full syntax and examples are on MDN: Proxy.
Feature detection
JS · check before using
if (typeof Proxy !== "undefined") {
// Proxy is available
}Documentation (MDN)
Specification
Usage share
Sub-features
Support for each part of the feature (30). The overall table above shows when the whole feature works.
| Sub-feature | Chrome | Edge | Firefox | Safari | Chrome Android | Firefox Android | Safari iOS |
|---|---|---|---|---|---|---|---|
| Proxy | 49 | 12 | 18 | 10 | 49 | 18 | 10 |
| Proxy.Proxy | 49 | 12 | 18 | 10 | 49 | 18 | 10 |
| Proxy.handler.apply | 49 | 12 | 18 | 10 | 49 | 18 | 10 |
| Proxy.handler.construct | 49 | 12 | 18 | 10 | 49 | 18 | 10 |
| Proxy.handler.defineProperty | 49 | 12 | 18 | 10 | 49 | 18 | 10 |
| Proxy.handler.deleteProperty | 49 | 12 | 18 | 10 | 49 | 18 | 10 |
| Proxy.handler.get | 49 | 12 | 18 | 10 | 49 | 18 | 10 |
| Proxy.handler.getOwnPropertyDescriptor | 49 | 12 | 18 | 10 | 49 | 18 | 10 |
| Proxy.handler.getPrototypeOf | 49 | 79 | 49 | 10 | 49 | 49 | 10 |
| Proxy.handler.has | 49 | 12 | 18 | 10 | 49 | 18 | 10 |
| Proxy.handler.isExtensible | 49 | 12 | 31 | 10 | 49 | 31 | 10 |
| Proxy.handler.ownKeys | 49 | 12 | 18 | 10 | 49 | 18 | 10 |
| Proxy.handler.preventExtensions | 49 | 12 | 22 | 10 | 49 | 22 | 10 |
| Proxy.handler.set | 49 | 12 | 18 | 10 | 49 | 18 | 10 |
| Proxy.handler.setPrototypeOf | 49 | 12 | 49 | 10 | 49 | 49 | 10 |
| Proxy.revocable | 63 | 12 | 34 | 10 | 63 | 34 | 10 |
| Reflect | 49 | 12 | 42 | 10 | 49 | 42 | 10 |
| Reflect.apply | 49 | 12 | 42 | 10 | 49 | 42 | 10 |
| Reflect.construct | 49 | 12 | 42 | 10 | 49 | 42 | 10 |
| Reflect.defineProperty | 49 | 12 | 42 | 10 | 49 | 42 | 10 |
Show 10 more
| Sub-feature | Chrome | Edge | Firefox | Safari | Chrome Android | Firefox Android | Safari iOS |
|---|---|---|---|---|---|---|---|
| Reflect.deleteProperty | 49 | 12 | 42 | 10 | 49 | 42 | 10 |
| Reflect.get | 49 | 12 | 42 | 10 | 49 | 42 | 10 |
| Reflect.getOwnPropertyDescriptor | 49 | 12 | 42 | 10 | 49 | 42 | 10 |
| Reflect.getPrototypeOf | 49 | 12 | 42 | 10 | 49 | 42 | 10 |
| Reflect.has | 49 | 12 | 42 | 10 | 49 | 42 | 10 |
| Reflect.isExtensible | 49 | 12 | 42 | 10 | 49 | 42 | 10 |
| Reflect.ownKeys | 49 | 12 | 42 | 10 | 49 | 42 | 10 |
| Reflect.preventExtensions | 49 | 12 | 42 | 10 | 49 | 42 | 10 |
| Reflect.set | 49 | 12 | 42 | 10 | 49 | 42 | 10 |
| Reflect.setPrototypeOf | 49 | 12 | 42 | 10 | 49 | 42 | 10 |