8
var p = function () {
    this.show = function () {
       alert('hello world!!!');
    }
}

p.prototype.show = function() {
    alert('haha');
}

var o  = new p();
o.show();

It alerts "hello world!!!", why?

Can I modify prototype method, if yes how?

Denys Séguret
  • 372,613
  • 87
  • 782
  • 758
smilexu
  • 101
  • 3

3 Answers3

7

That's because the specific function you define in the constructor overrides the one that is inherited through the prototype.

From EcmaScript specification :

Every object created by a constructor has an implicit reference (called the object’s prototype) to the value of its constructor’s “prototype” property. Furthermore, a prototype may have a non-null implicit reference to its prototype, and so on; this is called the prototype chain. When a reference is made to a property in an object, that reference is to the property of that name in the first object in the prototype chain that contains a property of that name. In other words, first the object mentioned directly is examined for such a property; if that object contains the named property, that is the property to which the reference refers; if that object does not contain the named property, the prototype for that object is examined next; and so on.

In short : when looking for a function (or any property by its name), you start at the object and then go up in the prototype chain.

Denys Séguret
  • 372,613
  • 87
  • 782
  • 758
3

You override your prototype.show method in p function.

Boris Pavlovic
  • 1,279
  • 8
  • 17
1

In Javascript when a property is resolved the engine first looks at the properties of an object. In your example the object would be represented by this. If it finds the property, in this case show (Remember functions can be properties) it uses that property. If the property is not found it then iterates down the prototype chain in an effort to resolve the property.

Kevin Bowersox
  • 93,289
  • 19
  • 159
  • 189