【问题标题】:Why isn't the function declared in the prototype called?为什么原型中声明的函数没有被调用?
【发布时间】:2026-02-27 06:20:07
【问题描述】:
var p = function () {
    this.show = function () {
       alert('hello world!!!');
    }
}

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

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

它提醒"hello world!!!",为什么?

我可以修改原型方法吗,如果可以怎么办?

【问题讨论】:

  • 解释得很透彻:*.com/questions/310870/…
  • 仅供参考:如果需要,您可以调用原型方法:p.prototype.show.call(o)

标签: javascript inheritance prototype


【解决方案1】:

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

来自EcmaScript specification

构造函数创建的每个对象都有一个隐式引用 (称为对象的原型)到其构造函数的值 “原型”属性。此外,原型可能有一个非空 隐式引用其原型,等等;这被称为 原型链。当引用对象中的属性时, 该引用是指向该名称在第一个对象中的属性 包含该名称属性的原型链。其他 换句话说,首先要检查直接提到的对象是否有这样的 财产;如果该对象包含命名的属性,那就是 引用所指的财产;如果该对象不 包含命名属性,检查该对象的原型 下一个;等等。

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

【讨论】:

    【解决方案2】:

    您在 p 函数中覆盖了您的 prototype.show 方法。

    【讨论】:

      【解决方案3】:

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

      【讨论】: