为什么在JavaScript中添加一个原型函数而不是覆盖原始函数定义?

时间:2015-08-29 14:39:13

标签: javascript oop inheritance

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

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

//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();

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

这就是原型的工作原理。原型方法不会覆盖&#34;实例变量 - 相反,只有在对象自己的属性中查找失败时才会查询原型链。 (即,如果某个对象没有某个属性,则对该对象的原型进行检查,依此类推,向上传播原型链,直到找到第一个匹配为止。)< / em>的

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

答案 2 :(得分:0)

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