为什么我不能 "overwrite" javascript 中的方法?

why I can't "overwrite" a method in javascript?

我想通过将一个 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()
    }
}

这样当我执行new otherObj().otherFun()时,我得到了预期的结果('This is the overwritten function.'),但是如果我要添加的功能已经是 originalObject

的一部分
var originalObject = function(){
    this.fun = function(){
        return 'This is the original function';
    }
    this.someFun = function(){
        // ...
    }
}

那么结果不是预期的,事实上 new otherObj().otherFun() returns 'This is the original function' .

那么,this 是将方法添加到原型并覆盖它的唯一方法吗?最重要的是,为什么我不能 "overwrite" 原型中的函数?

在js对象中有直接依赖对象和直接依赖原型两个层次。当您调用对象中的 属性 时,它会从根开始搜索,然后在分支中查找。你可以看到下面的树:

因为对象中已经存在该函数,所以会调用它,而不是在对象原型中寻找。