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

时间:2012-12-05 08:18:31

标签: javascript inheritance prototype

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

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

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

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

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

3 个答案:

答案 0 :(得分:7)

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

来自EcmaScript specification

  

构造函数创建的每个对象都有一个隐式引用   (称为对象的原型)为其构造函数的值   “原型”财产。此外,原型可能具有非空值   隐含引用其原型,等等;这被称为   原型链。当引用对象中的属性时,   该引用是指第一个对象中该名称的属性   包含该名称属性的原型链。其他   单词,首先直接提到的对象进行检查   属性;如果该对象包含命名属性,那就是   参考所指的财产;如果那个对象没有   包含命名属性,检查该对象的原型   下一个;等等。

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

答案 1 :(得分:3)

您在prototype.show功能中覆盖了p方法。

答案 2 :(得分:1)

在Javascript中解析属性时,引擎首先查看对象的属性。在您的示例中,对象将由this表示。如果找到属性,在这种情况下show(记住函数可以是属性)它使用该属性。如果找不到该属性,则迭代原型链以努力解析该属性。