2016-03-04 3 views
-2

У меня есть очень простой код (http://plnkr.co/edit/voHWdFfwu7TUreyjsRiU?p=preview):JS прототип ─ почему 'undefined'?

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. Но что такое неожиданно, что первое предупреждение выводит «undefined». Почему?


UPD Специально для т.е. GURU. Если вы установите минус, PLZ, объясните, почему. Спасибо.


UPD 2. Я просто не ставил возвращение в первом Fnc.prototype.fooz (в то время как его redifining). Да, довольно наивная ошибка.

ответ

1

Во время первого 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. 
}; 

Экспериментирование с языком поможет вам изучить его. Но не изменяйте прототип внутри одной и той же функции в ваших проектах в реальном времени, так как это приведет к нежелательным результатам.

2

Ваше первое определение Func.prototype.fooz сначала переопределяет себя, а затем возвращает undefined. Ваше переопределение возвращает что-то.

В JavaScript без возврата большинство функций возвращаются не определены. Исключением являются функции, называемые новыми.

1

Он выводится на консоль, как ожидалось, 1,2,7. Но что неожиданно, , что первое предупреждение выводит «undefined». Но почему?!

Когда вы переопределены Fnc.prototype.fooz внутри Fnc.prototype.fooz он заменил предыдущее определение Fnc.prototype.fooz, не возвращавшегося ничего (средства, возвращающиеся undefined).

Обратите внимание, что даже если вы переопределили его выполнение функции Fnc.prototype.fooz(); сделано в первую очередь.

Например, если добавить console.log, прежде чем функции exection

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 внутри новое определение (то есть, console.log('i: ', i);) печатается, потому что предыдущее определение было перекрываться ,

Смежные вопросы