ES6 classes work in Chrome 49+, Edge 13+, Firefox 45+, Safari 9+ on macOS and iOS, Opera 36+, and Samsung Internet 5+. Learn ES6 class browser support, features, and known issues.

Prince Dewani
May 1, 2026
ES6 Class is JavaScript syntax that Ecma TC39 added in ECMAScript 2015 to declare object templates with constructors, methods, and prototype-based inheritance. It works in Chrome 49+, Edge 13+, Firefox 45+, Safari 9+ on macOS and iOS, Opera 36+, and Samsung Internet 5+, while Internet Explorer never added support.
This guide covers what ES6 Class is, the browsers that support it, the key features, how to check support, the difference between ES6 classes and ES5 prototypes, and the known issues.
ES6 Class is the class declaration syntax in ECMAScript 2015, the sixth edition of the ECMA-262 standard published by Ecma International's TC39 committee. It uses the class keyword to declare object templates with a constructor, instance methods, static methods, getters and setters, and prototype-based inheritance through extends and super.
ES6 classes work in every modern desktop and mobile browser by default, with Chrome, Edge, Firefox, Safari, Opera, and Samsung Internet all shipping the full class declaration syntax. Internet Explorer is the only major holdout, and it does not parse the class keyword in any version.
Chrome supports ES6 classes from Chrome 49 on Windows, macOS, Linux, ChromeOS, and Android. Chrome 42 to 48 had partial support behind the Experimental JavaScript flag at chrome://flags. Chrome 4 to 41 did not parse the class keyword. Chrome for Android matches desktop Chrome from Chrome 49 on Android 4.1 and later.
Microsoft Edge supports ES6 classes from Edge 13 on Windows 10, the EdgeHTML release that completed the class declaration parser. Edge 12 did not parse the class keyword. Chromium-based Edge from Edge 79 inherits Chrome's full class support on Windows, macOS, Linux, and Android.
Firefox supports ES6 classes from Firefox 45 on Windows, macOS, Linux, and Android. Firefox 1 to 44 threw a SyntaxError on any class declaration. Firefox for Android shipped class support in the same Firefox 45 release, and the version numbers for desktop Firefox and Firefox for Android have stayed in sync ever since.
Safari supports ES6 classes from Safari 9 on macOS El Capitan and from Safari 9 on iOS 9. WebKit shipped most class plumbing in Safari 9.1 and finished the spec in Safari 10, including subclassing built-ins like Array and Error. Safari 8 and earlier do not parse the class keyword on either macOS or iOS.
Opera supports ES6 classes from Opera 36, which tracks the same Chromium engine as Chrome 49. Opera 29 to 35 had partial support behind the experimental flag, mirroring Chromium's progress. Opera Mobile 36 and later support classes on Android. Opera 12 and earlier on the Presto engine do not parse the class keyword.
Samsung Internet supports ES6 classes from Samsung Internet 5 on Galaxy phones and tablets. Samsung Internet 4 did not support classes. The browser is built on Chromium, so the class rollout matches Chrome for Android from version 5 on, including support for extends and super.
Chrome for Android supports ES6 classes from Chrome 49 on Android 4.1 and later. The legacy stock Android Browser shipped with Android 4.4 and earlier does not parse the class keyword. Modern Android phones use Chrome for Android, Samsung Internet, or Firefox for Android, all of which support ES6 classes by default.
Internet Explorer does not support ES6 classes in any version. IE 9, 10, and 11 throw a SyntaxError on the class keyword and stop parsing the rest of the script. Microsoft has retired Internet Explorer, so any new ES6 class work targets Edge or another modern browser. Sites that still serve IE 11 traffic must compile classes to ES5 prototype code with Babel or TypeScript.
Note: ES6 class syntax breaks across Internet Explorer and legacy mobile WebViews. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!
ES6 classes formalize the JavaScript pattern of building constructor functions and prototype chains by hand. The class keyword wraps every important piece of object-oriented JavaScript, including instance state, methods, static members, accessors, private fields, and inheritance.
You can confirm ES6 class support inside any browser by trying to compile a small block of class syntax with the Function constructor. The Function constructor throws a SyntaxError on engines that cannot parse the class keyword, which gives you a reliable yes or no answer without breaking the rest of the page.
Paste this snippet into the browser DevTools console to confirm class support and the related private-fields hook:
// Paste this into the browser DevTools console to test ES6 class support.
function supportsEs6Class() {
try {
new Function("class Box { constructor(v) { this.v = v; } static of(v) { return new Box(v); } }");
new Function("class A {}; class B extends A { constructor() { super(); } }");
return true;
} catch (e) {
return false;
}
}
function supportsPrivateFields() {
try {
new Function("class T { #x = 1; getX() { return this.#x; } }");
return true;
} catch (e) {
return false;
}
}
console.log("ES6 class supported:", supportsEs6Class());
console.log("Private fields supported:", supportsPrivateFields());If supportsEs6Class() returns true, the engine handles the constructor, static methods, extends, and super in a single class declaration. The supportsPrivateFields() check tells you whether the same engine accepts the hash-prefix syntax for private state, which is the gate for production code that uses #fields.
An ES5 constructor function is a regular function called with new, with methods attached one by one to the prototype. An ES6 class wraps the same prototype machinery in a single declaration and adds static, extends, and private fields on top.
| Dimension | ES5 prototype | ES6 class |
|---|---|---|
| Declaration | function Foo() with manual prototype setup | class Foo with all methods inside the body |
| Method definition | Foo.prototype.bar = function () | Method shorthand inside the class body |
| Inheritance | Manual Object.create and Foo.prototype = ... wiring | extends keyword and super() call in the constructor |
| Static members | Foo.staticMethod = function () attached to the function | static keyword inside the class body |
| Hoisting | Function declarations hoisted with the function body | Class declarations hoisted but stay in the temporal dead zone |
| Strict mode | Opt-in with "use strict" | Always strict inside the class body |
| Private state | Closure pattern or underscore convention | #field private fields and #method private methods |
| Browser reach | Every browser including IE 9, 10, and 11 | Chrome 49+, Firefox 45+, Safari 9+, Edge 13+, Opera 36+, Samsung Internet 5+. IE has no support. |
ES6 class syntax has near-universal modern support, but a few real failure modes still bite teams that target older Windows fleets, embedded WebViews, or features layered on top of the basic class declaration. The biggest hits are Internet Explorer, late sub-features like private fields, and Babel down-compilation quirks.
In my experience, the most surprising failure happens on enterprise Windows fleets where IE 11 still loads in compatibility mode for one internal app. A single inline class declaration in a third-party widget script crashes the whole page with "Object doesn't support this property or method", and the error never surfaces in dev tools because IE silently skips the rest of the script. Always wrap third-party widgets in a feature detect or a Babel build before shipping to a Windows enterprise audience.
All ES6 class version numbers and feature notes in this guide come from these primary sources:
Did you find this page helpful?
More Related Hubs
TestMu AI forEnterprise
Get access to solutions built on Enterprise
grade security, privacy, & compliance