JS原型 ─为什么是“未定义”
JS prototype ─ why 'undefined'?
我有一个非常简单的代码(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因为以前的定义已被覆盖。
- 为什么“;未定义的“;在JavaScript中结束循环
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- 为什么localStorage[“..”]未定义,而localStorage.getItem(“..”)为null
- 解析-为什么user.getSessionToken()返回未定义的结果
- 为什么这个函数调用会破坏程序并导致未定义的变量
- 为什么我会出现此错误"未捕获引用错误:未定义标题;
- 为什么JavaScript抛出'未捕获的ReferenceError:var未定义'定义var时
- 为什么这个JS代码打印未定义
- 为什么innerHTML返回“未定义”
- 为什么typeof的数组的数组的未定义值返回为“0”;未定义的“;我的条件不认为是真的
- 为什么我看到“;类型错误:游标未定义“;当使用indexedDB时
- 为什么分配给“NaN”或“未定义”会导致类型错误
- 类型错误:无法读取未定义的属性“toString” - 为什么
- 自定义函数返回正确的结果,并且未定义.为什么
- 函数值/名称的类型值日志为“未定义”.为什么
- Javascript:什么等于未定义?为什么不't myVar==未定义的工作
- Javascript数组并将它们赋值给变量,但第一个值为未定义.为什么
- ExtJS Ext.panel.body未定义.为什么
- Javascript:数组
- 无法访问现有节点包的属性,因为它是'未定义'为什么