7 ms·
AFAIK, using 'new' is not a matter of preference. Omitting the keyword leads to different results. Am I missing something?
by AjJi 14y ago
AFAIK, using 'new' is not a matter of preference. Omitting the keyword leads to different results. Am I missing something?
- MatthewPhillips 14y agoSome people think that library consumers shouldn't have to use new. Instead they should call a factory function (which itself calls new).
- phleet 14y agoHere's an argument in favor of not requiring library consumers to use new by the author of the Raphäel library: http://dmitry.baranovskiy.com/post/something-new http://dmitry.baranovskiy.com/post/something-new
- orangecat 14y agoAnd I agree with that. "new" exposes too much implementation detail: it always allocates an object, and it's exactly the type specified, neither of which callers should normally care about. I much prefer how Python does it.
- ufo 14y agoActually, in Javascript you can preemptively return a value of a different type from the constructor instead of relying on the implicit `return this` at the end. That said, I agree that the way "new" specifies the concrete type of the returned value is pure evil. In OO things should be typed according to their interfaces, not according to their concrete implementations.
- shawndumas 14y agoif (!(this instanceof arguments.callee)) { return new arguments.callee(/* parms */); }
- ufo 14y agoYou can't use arguments.callee when in strict mode. So far the only alternative is to manually encode the class name and argument list: if(!(this instanceof MyClass)){ return new MyClass(a,b,c) }
- shawndumas 14y agoCorrect. But, like John Resig, I am gonna miss it... "Personally, I’m going to miss arguments.callee, I used it in a number of places in my code." -- John Resig (May 22, 2009 at 7:26 am) [1] ---- [1]: http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/#comment-384866 http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more...
- petercooper 14y agoIt does but there are other ways to create objects (even using prototypal inheritance) in JavaScript that are pretty popular in the wild (Object.create and object literals with {} for example). The code behind this and the constructors, etc, would need to be rather different though (that is, you're right, you can't just drop new and expect it to work as-is.)