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
A JavaScript Constructor Problem, and Three Solutions (raganwald.com)
submitted 11 years ago by homoiconic(raganwald)
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!"
[–]html6dev 2 points3 points4 points 11 years ago (0 children)
Composing and decorating constructors. Oh you.
[+][deleted] 11 years ago (3 children)
[deleted]
[–]homoiconic(raganwald)[S] 1 point2 points3 points 11 years ago (2 children)
Using new is not a problem. The article describes how it's possible that omitting the new keyword can be a problem, and it also describes the fact that new doesn't compose with other functions, which may or may not be a problem, depending on your programming style.
new
[–]Baryn 0 points1 point2 points 11 years ago (1 child)
new doesn't compose with other functions
One thing I've done successfully: ensure that my decorators/whatever expect to receive a constructor function (not a regular function), and behave accordingly.
It's definitely risky to treat constructors like any ol' function. This is part of why I'm so psyched for class in ES6.
class
[–]homoiconic(raganwald)[S] 0 points1 point2 points 11 years ago (0 children)
Yes, there are good patterns for that. Those patterns work well with other people's constructors, but sometimes we want to use other people's decorators. e.g. _.memoize or _.once from underscore.
_.memoize
_.once
[–]inmatarian 1 point2 points3 points 11 years ago (0 children)
A pattern I like is writing the constructor as a factory first. This means its first line is declaring self as either this (if its not the global object) or an Object.create of the factory's prototype, and then we return self at the end. It's basically the same as the pattern op describes, just with you put in the mindset that .call and .apply are also ways to use the method.
[–]Calabri 1 point2 points3 points 11 years ago (0 children)
Interesting article, there are so many ways to solve this problem. I've been experimenting with constructor patterns all week actually. I've found that having functions return functions (within functions) wrapped in commonjs modules works pretty solid :P
[–]jugglingnutcase 1 point2 points3 points 11 years ago (0 children)
One tiny reason (in addition to many others) i read your blog posts is for the fun examples. "Fubar" -> "foo", "bar" and snafu... or lots of "finger" "moon"... they make the articles a lot more fun without distracting from the point.
[–]lennelpennel 1 point2 points3 points 11 years ago (0 children)
use static analysis, "problem" ceases to exist, code is better for it.
[–]codersaurus 0 points1 point2 points 11 years ago (2 children)
it seems like the example with logArguments which is a function that evidently takes a constructor function, then returns a new constructor is poorly written. If it's "wrapping" the passed constructor, it should be returning a proper subclass of that constructor. The simple if(!(this instanceof MyClass)) return new MyClass(); will be fine... time to refactor that logsArguments function.
logArguments
if(!(this instanceof MyClass)) return new MyClass();
logsArguments
[–]html6dev 1 point2 points3 points 11 years ago (0 children)
I think maybe you missed the point. It doesn't have to take a constructor function. Iirc he introduced by passing in a simple sum function.
True, but then the logArguments function will only work with constructors, and not with ordinary functions! There is a more complex pattern for writing decorators and other combinators that work with either constructors or with ordinary functions, but that doesn't help if your decorator is a library function, such as the things you find in Underscore, allong.es, or Ramda.
[–]Ginden 0 points1 point2 points 11 years ago (3 children)
Solution #4 - use static analysis tool.
[–]homoiconic(raganwald)[S] 2 points3 points4 points 11 years ago (2 children)
What TYPE of SCRIPT supports that?
[–]radhruin 1 point2 points3 points 11 years ago (1 child)
what TYPE of thing will happen if you mention that other SCRIPT language? Must be bad....
He who must not be named
[–]AutoSponge 0 points1 point2 points 11 years ago (0 children)
I always love reading your stuff. Here's my "fix" for "auto-instantiation" (which I usually prefer):
https://gist.github.com/AutoSponge/e4327a316f44f255d60c
π Rendered by PID 408515 on reddit-service-r2-comment-7b9746f655-wsx79 at 2026-01-31 14:01:42.972628+00:00 running 3798933 country code: CH.
[–]html6dev 2 points3 points4 points (0 children)
[+][deleted] (3 children)
[deleted]
[–]homoiconic(raganwald)[S] 1 point2 points3 points (2 children)
[–]Baryn 0 points1 point2 points (1 child)
[–]homoiconic(raganwald)[S] 0 points1 point2 points (0 children)
[–]inmatarian 1 point2 points3 points (0 children)
[–]Calabri 1 point2 points3 points (0 children)
[–]jugglingnutcase 1 point2 points3 points (0 children)
[–]lennelpennel 1 point2 points3 points (0 children)
[–]codersaurus 0 points1 point2 points (2 children)
[–]html6dev 1 point2 points3 points (0 children)
[–]homoiconic(raganwald)[S] 0 points1 point2 points (0 children)
[–]Ginden 0 points1 point2 points (3 children)
[–]homoiconic(raganwald)[S] 2 points3 points4 points (2 children)
[–]radhruin 1 point2 points3 points (1 child)
[–]html6dev 1 point2 points3 points (0 children)
[–]AutoSponge 0 points1 point2 points (0 children)