On 12/23/10, Michael Haufe (TNO) <t...@thenewobjective.com> wrote:
>> On 23.12.2010 18:28, Joel Dart wrote:
>> new is a bad part primarily because of its dangerous potential for adding
>> global variables.
>> Specifically, using the previous example
>>
>> > function A(x) {
>> >   this.x = x;
>> > }
>>
>> > A.prototype.foo = function () {
>> >   return this.x;
>> > };
>>
>> > // and instance of the constructor "A"
>> > var a = new A(10);
>>
>> If instead you accidentally forgot new:
>>
>> var a = A(10);
>>
>> A would be a normal function call and, inside A, “this” would point to the
>> global object. You’d create a new global variable x which is obviously
>> unintended.  Using the Object.create pattern you have a consistent
>> experience and don’t have to validate if you and your coworkers properly
>> used “new.”
>
> Or simply do this in your constructors and it becomes an irrelevant
> point:
>
> function Point(x, y){
>     if(!(this instanceof Point)
.................................^

Missing ')'.

>         return new Point(x, y);
>     this.x = x;
>     this.y = y;
> }
>

I rather have it one way or the other. e.g.

  makePoint(x, y);

 - OR -

  new Point(x, y);

I just don't like seeing any extra if/else in the code. I also don't
want to handle the case where somebody might be relying on an anomaly
of calling the constructor as a function call.

> Plus when using the constructor pattern, Java style "super" calls can
> be emulated with apply()
>
When Point has a superclass or when Point *is* the superclass?

ISTM that such example won't work when Point is the superclass.

function Point(x, y){
     if(!(this instanceof Point)) {
         alert("Point recurse");
         return new Point(x, y);
     }
     this.x = x;
     this.y = y;
 }
function P3D(x, y, z) {
// A point is returned here, and `this` object
// does not have `x` and `y`.
  Point.call(this, x, y);
  this.z = z;
}

new P3D(1, 2, 3);

That violates LSP anyway and probably a fair example to show such violation.

Generally I keep the constructors private and only use factories and
return an interface object. Doing that avoids having to deal with
constructor issues.
-- 
Garrett

-- 
To view archived discussions from the original JSMentors Mailman list: 
http://www.mail-archive.com/jsmentors@jsmentors.com/

To search via a non-Google archive, visit here: 
http://www.mail-archive.com/jsmentors@googlegroups.com/

To unsubscribe from this group, send email to
jsmentors+unsubscr...@googlegroups.com

Reply via email to