为什么在原型中添加一个函数不能覆盖JavaScript中原来的函数定义?

Why does adding a function to prototype NOT over-ride original function definition in JavaScript?

本文关键字:函数 覆盖 不能 JavaScript 定义 原来 添加 原型 为什么 一个      更新时间:2023-09-26

如果我创建一个基本对象并在其内部声明一个函数,然后稍后使用它的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();

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

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

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

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