为什么在原型中声明的函数没有被调用?

smi*_*exu 8 javascript inheritance prototype

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

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

var o  = new p();
o.show();
Run Code Online (Sandbox Code Playgroud)

它警告"hello world!!!",为什么?

我可以修改原型方法,如果是的话怎么样?

Den*_*ret 7

那是因为您在构造函数中定义的特定函数会覆盖通过原型继承的函数.

来自EcmaScript规范:

构造函数创建的每个对象都有一个隐式引用(称为对象的原型)到其构造函数的"prototype"属性的值.此外,原型可能具有对其原型的非null隐式引用,依此类推; 这被称为原型链.当引用对象中的属性时,该引用是原型链中包含该名称属性的第一个对象中该名称的属性.换句话说,首先检查直接提到的对象的这种属性; 如果该对象包含命名属性,那么该引用引用的属性; 如果该对象不包含命名属性,则接下来检查该对象的原型; 等等.

简而言之:在查找函数(或其名称的任何属性)时,从对象开始,然后进入原型链.