如果我创建一个基本对象并在其中声明一个函数,那么稍后使用它的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();
答案 0 :(得分:1)
因为当你调用new Apple()
时,会调用构造函数中的原始this.getInfo = function
,覆盖你在原型上指定的内容。
答案 1 :(得分:1)
这就是原型的工作原理。原型方法不会覆盖&#34;实例变量 - 相反,只有在对象自己的属性中查找失败时才会查询原型链。 (即,如果某个对象没有某个属性,则对该对象的原型进行检查,依此类推,向上传播原型链,直到找到第一个匹配为止。)< / em>的
在这种情况下,getInfo
上存在a
,因此不会对原型链进行查找。
答案 2 :(得分:0)
它完全相反。在实例本身(在构造函数中)创建的方法会覆盖从原型对象继承的方法。请注意,它们在源代码中出现的顺序与此无关。