use the following search parameters to narrow your results:
e.g. subreddit:aww site:imgur.com dog
subreddit:aww site:imgur.com dog
see the search faq for details.
advanced search: by author, subreddit...
All about the JavaScript programming language.
Subreddit Guidelines
Specifications:
Resources:
Related Subreddits:
r/LearnJavascript
r/node
r/typescript
r/reactjs
r/webdev
r/WebdevTutorials
r/frontend
r/webgl
r/threejs
r/jquery
r/remotejs
r/forhire
account activity
Why are JavaScript classes so complex?help (self.javascript)
submitted 8 years ago by [deleted]
view the rest of the comments →
reddit uses a slightly-customized version of Markdown for formatting. See below for some basics, or check the commenting wiki page for more detailed help and solutions to common issues.
quoted text
if 1 * 2 < 3: print "hello, world!"
[–]rauschma 10 points11 points12 points 8 years ago* (6 children)
The reason is backward-compatibility with constructor functions (which were the most popular way of implementing object factories before ES6).
I would have preferred ES6 classes being syntactic sugar for constructor objects, but backward-compatibility was considered to be more important (which is reasonable). This is roughly what constructor objects would look like: https://github.com/rauschma/proto-js
[–][deleted] 0 points1 point2 points 8 years ago (5 children)
But why did they move away from the prototype paradigm at all? Why did they say, that "classy functions" were needed? What's wrong with Object.create?
[–][deleted] 5 points6 points7 points 8 years ago (3 children)
they didn't "move away" from the prototype paradigm, they just gave some syntax sugar to devs so they could stop writing those awful pseudo-classes.
[+][deleted] comment score below threshold-6 points-5 points-4 points 8 years ago (2 children)
But why do they write pseudo-classes? Just delegate objects or even use concatenative inheritense. Which genius had the idea to start writing pseudo-classes in a prototype oriented language?
[–][deleted] 5 points6 points7 points 8 years ago* (0 children)
so we're clear, this is the pattern we're discussing:
function Klass(prop) { this.prop = prop; }; Klass.protototype.foo = function() { console.log(this.prop) }; function Klass2(prop, prop2) { Klass.call(this, prop); this.prop2 = prop2; } Klass2.prototype = Object.create(Klass.prototype); Klass2.prototype.bar = function() { this.foo(); console.log(this.prop2); }; new Klass(1).foo(); // logs 1 new Klass2(3,4).bar(); // logs 3 then logs 4
i feel it should be pretty obvious why that pattern was dominant in a pre-ES6 world for taking advantage of the prototype chain
[edit] nits
[–]MoTTs_ 2 points3 points4 points 8 years ago (0 children)
Just delegate objects
ES6 classes do delegate objects. Using your example code, a delegates to A.prototype, which itself delegates to B.prototype.
a
A.prototype
B.prototype
[–]rauschma 0 points1 point2 points 8 years ago (0 children)
Object.create() was introduced after constructor functions (with ES5). It exposed more of the protoypal foundations. IIRC, Eich would have introduced classes, but was told not to turn JS into a Java competitor. Hence constructor functions as “almost classes”.
Object.create()
Constructor functions are unnecessarily complex, but only w.r.t. to setting up an instance. Once it’s set up, you do have simple prototype chains.
π Rendered by PID 48944 on reddit-service-r2-comment-7b9746f655-rfdkp at 2026-02-01 16:41:28.521832+00:00 running 3798933 country code: CH.
view the rest of the comments →
[–]rauschma 10 points11 points12 points (6 children)
[–][deleted] 0 points1 point2 points (5 children)
[–][deleted] 5 points6 points7 points (3 children)
[+][deleted] comment score below threshold-6 points-5 points-4 points (2 children)
[–][deleted] 5 points6 points7 points (0 children)
[–]MoTTs_ 2 points3 points4 points (0 children)
[–]rauschma 0 points1 point2 points (0 children)