JS原型 ─为什么是“未定义”

JS prototype ─ why 'undefined'?

本文关键字:未定义 为什么 原型 JS      更新时间:2023-09-26

我有一个非常简单的代码(http://plnkr.co/edit/voHWdFfwu7TUreyjsRiU?p=preview):

function Fnc(){}
Fnc.prototype.fooz = function(){
    var i=0;
    Fnc.prototype.fooz = function(){
        ++i;
        console.log('i: ', i);
        return i;
    };
    Fnc.prototype.fooz();
};

window.onload=function(){
    var fa = new Fnc();
    alert(fa.fooz()); // undefined!
    alert(fa.fooz()); // 2
    alert(fa.fooz() + fa.fooz()); // 7
};

它按预期输出到控制台 1,2,7。但出乎意料的是,第一个警报输出"未定义"。为什么?


UPD特别是对于即大师。如果您设置了减号,请解释原因。谢谢。


UPD 2.我只是没有在第一个 Fnc.prototype.fooz 中设置返回(虽然它重新提炼)。是的,相当幼稚的错误。

Func.prototype.fooz 的第一个定义首先重新定义自身,然后返回 undefined。你的重新定义会返回一些东西。

在没有返回的JavaScript中,大多数函数返回undefined。例外是使用 new 调用的函数。

在第一个alert(fa.fooz()); Fnc.prototype.fooz不返回任何内容。所以默认情况下,函数将返回 undefined ,不是一直返回,但在我们的情况下它会返回undefined 。后来,Fnc.prototype.fooz被分配了新函数,它返回i值。这就是为什么它正在产生预期的结果。

Fnc.prototype.fooz = function(){
    var i=0;
    Fnc.prototype.fooz = function(){
        ++i;
        console.log('i: ', i);
        return i;
    };
    Fnc.prototype.fooz();  // This is not retuning anything 
};

如果您想获得所需的结果,只需更改代码,如下所示,

Fnc.prototype.fooz = function(){
    var i=0;
    Fnc.prototype.fooz = function(){
        ++i;
        console.log('i: ', i);
        return i;
    };
    return Fnc.prototype.fooz();  // add a return here. 
};

尝试语言将指导您探索它。但是不要在实时项目中修改同一函数中的原型,因为这会导致不良结果。

它按预期输出到控制台 1,2,7。但出乎意料的是, 第一个警报输出"未定义"。但是为什么?!

当您在 Fnc.prototype.fooz 中重新定义 Fnc.prototype.fooz 时,它替换了之前不返回任何内容的Fnc.prototype.fooz定义(表示返回 undefined )。

请注意,即使您重新定义了它,函数执行Fnc.prototype.fooz();首先完成。

例如,如果我在函数执行之前添加一个console.log

function Fnc(){}
Fnc.prototype.fooz = function(){
    var i=0;
    Fnc.prototype.fooz = function(){
        ++i;
        console.log('i: ', i); //second print when executed first time
        return i;
    };
    console.log(Fnc.prototype.fooz); //this line will be printed first
    Fnc.prototype.fooz();
};

下次以后,仅打印新定义(即 console.log('i: ', i); )内的控制台.log因为以前的定义已被覆盖。

相关文章: