为什么我能';";覆盖";javascript中的方法?
我想通过将JS对象的函数添加到其原型中来覆盖它为什么我能';";覆盖";javascript中的方法?,javascript,node.js,overriding,Javascript,Node.js,Overriding,我想通过将JS对象的函数添加到其原型中来覆盖它 var originalObject = function(){ this.someFun = function(){ // ... } } var otherObj = function(){ this.otherFun = function(){ originalObject.prototype.fun = function(){ return 'This is
var originalObject = function(){
this.someFun = function(){
// ...
}
}
var otherObj = function(){
this.otherFun = function(){
originalObject.prototype.fun = function(){
return 'This is the overwritten function.';
}
var o = new originalObject();
return o.fun()
}
}
这样,当我执行new otherObj().otherFun()
时,我得到了预期的结果('这是被覆盖的函数。),但是如果我试图添加的函数已经是原始对象的一部分
var originalObject = function(){
this.fun = function(){
return 'This is the original function';
}
this.someFun = function(){
// ...
}
}
然后结果不是预期的结果,实际上new otherObj()。otherFun()
返回“这是原始函数”
那么,将方法添加到原型并重写它的唯一方法是什么?最重要的是,为什么我不能“覆盖”原型中的函数?在js对象中,有两个级别,分别依赖于直接对象和直接依赖于原型。当您调用对象中的属性时,它会从根开始搜索,然后查找分支。您可以看到下图中的树:
因为该函数已经存在于对象中,它将被调用,而不是在对象原型中查找。试着看看我认为继承是从父代到子代的。如果有两个函数,一个在原型中,另一个在从原型继承的对象中,则对象(子对象)中的函数将覆盖原型中的函数。因此:您正在覆盖原型中的函数,而不是对象中的函数。
var originalObject = function(){
this.someFun = function(){
// ...
}
}
var otherObj = function(){
this.otherFun = function(){
originalObject.prototype.fun = function(){
return 'This is the overwritten function.';
}
var o = new originalObject();
return o.fun()
}
}