Hacker News new | comments | show | ask | jobs | submit login

Just a few comments:

> if (!(this instanceof MyClass)) return new MyClass();

If you really want, just throw an exception and kill the program at compile time. Catch programming errors in testing and not do some magic to 'autocorrect' code.

> var localFile = fs.createWriteStream('localFile.tmp');

Always catch 'error's in stream objects. Otherwise, it might thrown an exception at runtime.

localFile.on('error', /* do something */)

Coding style: In most cases if you write you code properly, you don't need to nest more than 3-4 levels. If it gets deeper split it out into separate functions. Otherwise, it's a perfect job for async.series.




Agree about the instanceof trick. I hate that pattern. I'm not sure if it's done to avoid using "new" or because people legitimately make the mistake.


It's not about "making a mistake", it's about cases where you'd want to create objects but using `new` would be awkward. E.g. `myListOfRawData.map(MyConstructor)` when you unmarshal data. Sure, you could create an anonymous function that calls new. But it's easier to create higher level functions and tools when the new is optional.


It's to avoid using "new".


> It's to avoid using "new".

yeah,well one is still using new inside the constructor.

it's pretty obvious to me that :

1/ one should read the docs before using an api

2/ capitalized functions are meant to be used as constructors.

3/ If you dont like this pattern,write builders and make them obvious. like Object.create()

To me when i design js APIs, I have 2 kind of "templates" :

the jQuery "$(o).after(b).get(0)"/underscore "_(object).method().value()" monadic api style that wraps types (like promises)

OR

The way the DOM is built,more java-ish with builders everywhere ( document.createElement ... ).

So I hardly use new anymore.

I get that people might make mistake or like Python style OO;but still, I think forcing the "new" in unecessary.


Cant you just "return this;" to avoid using "new"?


> Cant you just "return this;" to avoid using "new"?

THIS will be the global scope if a function meant to be a constructor is called without new.

Try that in your console

   function Foo(){this.foo = "bar";return this}
then do :

   Foo() ;
it will return window;

so the answer is no.


The answer is yes if you do:

    Foo.call({});


That's a cool trick, though 'instanceof' won't work in this case.


Yup. The proper way to emulate new is

    Foo.call(Object.create(Foo.prototype))


Douglas Crockford, is that you? Oh the lengths people will go to avoid using 'new'...

I wonder if any linters out there warn when they see something like:

  something = SomeCapitalizedFunction()
Because forgetting to use 'new' is really the only thing I could think of that makes this pattern dangerous.


Yes, jslint and jshint both do, by default, iirc. They'll also warn on the opposite (using 'new' with a function that doesn't start with an uppercase letter).


Ah that's fantastic, i've been using them for a while and never noticed.


why do people want to avoid using new?


If you accidentally forget to use 'new' when you're supposed to, the "constructor" method will change the global object instead of a new object, it can cause strange behavior that is very hard to trace.


Ah, I see. I guess I've never forgotten to use new. That does sound incredibly annoying to debug.




Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | DMCA | Apply to YC | Contact

Search: