2014-12-23 3 views
0

У меня есть этот простой код Javascript, чтобы написать несколько модулей, но я не знаю, почему я получаю неопределенные результаты, даже когда я звоню функции внутри:Почему это Javascript класс возвращает неопределенное значение

window.onload = function() { 
    function testFunction() { 
     this.hours = null; 
     function getHours() { 
      return this.hours; 
     } 

     alert(getHours()); 
     return { 
      getHours: function() { 
       return getHours(); 
      } 
     } 
    } 

    var test = new testFunction(); 
    alert(test.getHours()); 

} 

I думаю, что у меня проблема в понимании ключевого слова THIS в javascript и использования его внутри javascript-конструкторов.

спасибо.

+1

«Это» внутри вашей функции «getHours» не является тем же самым «этим» вне его. –

+0

@VsevolodGoloviznin Что по-другому? Я хочу понять ЭТО НАСТОЯЩИМ! Спасибо за ваш комментарий. – Mohammad

+0

@Mohammad это очень просто - если вы вызываете 'obj.myFunc()' then' this === obj'. Но если вы просто назовете 'myFunc()' then 'this === window' (или' null' в строгом режиме ES5!) – Alnitak

ответ

1

Ваша (начальная) проблема здесь:

return { 
    getHours: function() { 
     return getHours(); 
    } 
} 

Делая «голый» вызов getHours() внутри этой функции вы теряете любой this контекст, который был.

Вместо этого:

return { 
    getHours: getHours 
} 

т.е. возвращает объект, который содержит ссылку на нужную функцию. Когда вы позвоните test.getHours(), он правильно пройдет test как this до getHours.

Другой вопрос заключается в том, что, поскольку вы используете return выставить набор функций, что возвращаемый объект становится вновь не построен this и больше не относится к this, что вы добавили hours к!

Это неудачный мишмаст двух (или, может быть, более) методов JS OOP, и они противоречат друг другу.

+0

Что-то! Неопределенные результаты! – Mohammad

+0

ОК - в игре есть что-то еще - позвольте мне проверить – Alnitak

+0

Правильно, вы должны использовать 'var hours', а не' this.hours'. – Alnitak

1

Ну, подумайте о том, на что указывает это «это». Первый указывает на функцию, в которой он находится, «testFunction()». Второй указывает на функцию, в которой он находится, «getHours()», но вы определяете getHours дважды, и то, что вы возвращаете во второй раз, не определено, потому что у вас больше нет «этого». По умолчанию javascript возвращает «undefined», когда нет какого-то конкретного объекта, который вы хотите вернуть. Когда я пишу это, я замечаю еще один ответ, который предлагает решение вашей проблемы, поэтому я не буду повторять это здесь.

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