3

Is there a difference between these two statements in Javascript?

function p() {
    this.do = function(){alert('cool')};
}

and this one?:

function p(){};

p.prototype.do = function(){alert('cool')};

One more thing, why can't you do:

function p(){};

p.do = function(){alert('cool')};

Thank you so much!

James Allardice
  • 164,175
  • 21
  • 332
  • 312
Nathan Prometheus
  • 2,651
  • 2
  • 16
  • 7

2 Answers2

3

Given your first two examples, assuming you call p() as a constructor:

  • on the surface, they will behave identically

But the first example...

  • will create a new, identical function for each object created from new p()
  • [that function] will have access to the local variables and parameters inside the p() constructor
//                                    p.prototype = {}
new p(); // { do:function(){alert('cool')}; } ------^
new p(); // { do:function(){alert('cool')}; } ------^
new p(); // { do:function(){alert('cool')}; } ------^

and the second example...

  • will share the function placed on the prototype between all the objects created from new p()
  • [that function] will not have access to private variables/parameters in the constructor
//p.prototype = {do:function(){alert('cool')};}
new p(); // {} ------^
new p(); // {} ------^
new p(); // {} ------^

The third example does not work because in JavaScript, a function is an object, so all you're doing it placing a new property on that object. It has no effect on the invocation of that function.

user113716
  • 318,772
  • 63
  • 451
  • 440
  • One more question though, which one is "better", so to speak? – Nathan Prometheus Aug 20 '11 at 23:04
  • @Nathan: Neither. It all depends on what you need. If the function has no need for access to the private local variables in the constructor, then definitely place it on the `prototype` object so that you're not unnecessarily recreating the functions. If it does need access, then you really need to create the function inside the constructor. There are some patterns that are a little trickier that attempt to keep the private vars private, yet offer access via a function on the `prototype`, but I don't know if any solution really accomplishes it. – user113716 Aug 20 '11 at 23:19
0

Functionally speaking, they are the same.

The first one defines a function for each object var o = new p() so it is not optimal from a memory viewpoint.

You can do what you're showing in your 3rd example, but you're not going to accomplish what you think:

function p(){};

p.do = function(){alert('cool')};

p.do(); // this will work

var o = new p(); // This won't have the 'do' function because that's not how it works in javascript.
Pablo Fernandez
  • 103,170
  • 56
  • 192
  • 232