Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我能';";覆盖";javascript中的方法?_Javascript_Node.js_Overriding - Fatal编程技术网

为什么我能';";覆盖";javascript中的方法?

为什么我能';";覆盖";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

我想通过将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()
时,我得到了预期的结果('这是被覆盖的函数。),但是如果我试图添加的函数已经是
原始对象的一部分

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()
    }
}