【问题标题】:Why does adding a function to prototype NOT over-ride original function definition in JavaScript?为什么向原型中添加函数不会覆盖 JavaScript 中的原始函数定义?
【发布时间】:2015-08-29 14:39:12
【问题描述】:

如果我创建一个基本对象并在其中声明一个函数,然后使用它的原型属性覆盖原始函数定义 - 没有任何反应。原始函数定义保持不变。我想要一位经验更丰富的 JavaScript 开发人员来解释为什么这不起作用。我似乎无法通过 Google 搜索找到正确的信息。

这是我测试这个假设的代码。

//Object definition
function Apple(type) {
    this.color = "red";
    this.getInfo = function() {
    console.log("Called getInfo() from inside Apple - original");
  }
}

//over write getInfo() -- dosn't work
Apple.prototype.getInfo = function() {
  console.log("Apple getInfo called - prototype override");
};

a = new Apple();
a.getInfo();

【问题讨论】:

  • Apple 中的 getInfo() 将在构造函数运行时声明,因此您不会用原型覆盖它
  • 所以我必须修改我创建的实例上的原型(在本例中为变量 'a' )才能覆盖该函数?然后,如果我希望其他对象具有相同的覆盖,我必须根据“a”而不是“Apple”来创建??
  • 当一个属性被访问时,查找它的过程从对象本身开始,并且只有在对象上没有找到该属性时才会查询原型链。

标签: javascript oop inheritance


【解决方案1】:

因为当您调用new Apple() 时,会调用构造函数中的原始this.getInfo = function,覆盖您在原型上指定的内容。

【讨论】:

  • 原型属性的工作是在函数定义之后完成的。然后在此之后,声明变量'a'。原型模型如何完全忽略?那条线('Apple.prototype.getInfo')实际上什么都不做吗?
  • @AndyJackson 只有在没有直接在目标对象上找到该属性时才会查询原型链。
  • @AndyJackson 首先声明构造函数,然后声明原型上的内容,然后创建一个实例,在实例上设置原始getInfo,当您访问它时——原型链是未咨询。你得到了原始的getInfo 函数。
  • @AndyJackson:构造函数内部的新实例this.getInfo = … 的工作是在创建实例时完成的 - 在设置原型之后。
【解决方案2】:

这就是原型的工作原理。原型方法不会“覆盖”实例变量——相反,只有在对象自身属性中查找失败时才会查询原型链。 (即,如果一个对象没有特定的属性,则对该对象的原型进行检查,依此类推,向上传播原型链,直到找到第一个匹配项。)

在这种情况下,getInfo 存在于 a 上,因此不会在原型链上进行查找。

【讨论】:

    【解决方案3】:

    反之亦然。在实例本身(在构造函数中)创建的方法会覆盖从原型对象继承的方法。请注意,它们在源代码中出现的顺序与此无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-06
      • 2020-08-13
      • 2010-09-22
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多