views:

307

answers:

3

Hi,

could anyone please tell me, where in Javascript the difference between

MyClass.prototype = new Object(); //or ... = {}

and

MyClass.prototype = Object;

is? And if there is no difference in the result, which one is the best-practise-way-to-go?

Thank you, m

+1  A: 

It depends on Object. If it is a function you want to use the new Object() method. If it is a "virtual class" (defined using Object = {someProperty: someValue}) then you use the second method.

Some more pointers in this page on prototype inheritance in JavaScript

gnarf
Great link, thanks
moxn
+6  A: 

Your first two examples are completely equivalent:

MyClass.prototype = new Object(); // empty object
MyClass.prototype = {}; // empty object

Your third example is not valid, since you are assigning to the MyClass.prototype a reference to the Object constructor, and it's a function, not a new object.

I personally prefer the second, the object literal or initialiser syntax:

MyClass.prototype = {prop1: 'value', prop2: 'value2'};
//...
MyClass.prototype.foo = 'bar';
MyClass.prototype.method1: function () {/**/};

Edit: In response to your comment, an empty object literal { } essentially equivalent to new Object() because of this:

The production ObjectLiteral : { } is evaluated as follows:

  1. Create a new object as if by the expression new Object().
  2. Return Result(1).

For more details check the 11.1.5 section (Object Initialiser) of the ECMAScript Language Spec (pdf).

Edit: The third example won't produce any errors, but is not good at all, for example you can easily clobber the Object constructor function if you extend afterward the MyClass.prototype:

MyClass.prototype = Object;
MyClass.prototype.foo = 'bar';

Object.foo === MyClass.prototype.foo; // true
CMS
Hmhm, so if both examples don't produce errors of any kind and essentially do the same (as it actually is), it is just the laxity of the browser's javascript engine that allows the second example to work?
moxn
No, I know that {} == new Object(). What I meant by "second example" was ...prototype = Object;
moxn
Okay, I see. Thank you for the explanation.
moxn
You're welcome @moxn
CMS
A: 

MyClass.prototype.method1: function () {/**/};

Correction to the above: it should be

MyClass.prototype.method1 = function () {/**/}; (Note the equals sign after 'method1').

The colon is used only when the method definition is itself within an object definition, like:

var myObject = {myVar1: 10, myMethod1: function() { /* */};

JamieJag