开发者

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!


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.


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.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜