Nathan Prometheus
Nathan Prometheus

Reputation: 2901

Javascript and prototypal Inheritance

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!

Upvotes: 3

Views: 170

Answers (2)

user113716
user113716

Reputation: 322452

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.

Upvotes: 3

Pablo Fernandez
Pablo Fernandez

Reputation: 105210

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.

Upvotes: 0

Related Questions