2017-01-23 2 views
-2

Должен «это». или 'var', чтобы создавать переменные в классе Javascript или не имеет значения, что используется. Очевидно, те, которые определены с этим. будут доступны извне объекта, тогда как те, которые определены с var, не будут, но есть ли другие отличия?Переменные класса Javascript - это. или var

function myClass() { 
 
\t this.count = 0; 
 
\t this.oTimer = null; 
 
    this.getCount = function() { return(this.count); } 
 
} 
 
oMyObj = new myClass(); 
 
oMyObj.getCount(); // returns 0

в отличие от

function myClass2() { 
 
\t var count = 0; 
 
\t var oTimer = null; 
 
    this.getCount = function() { return(count); } 
 
} 
 
oMyObj = new myClass2(); 
 
oMyObj.getCount(); // returns 0

+2

'var' делает счет скрытым. Для 'this.count' вы можете получить доступ к счету, выполнив' oMyObj.count'. Читайте о области и закрытии javascript. –

+0

Лексический обзор моего друга :) – jdmdevdotnet

+2

Все зависит от видимости, которую вы хотите. Использование «этого» означает «это видимый член этого класса». Он также передает это намерение другим разработчикам. использование «var» означает «не использоваться снаружи» (и, опять же, сообщает это намерение). Однако обратите внимание, что в JavaScript, в конце концов, вообще можно получить любую часть данных независимо от того, как разработчик попытался скрыть ее. Модульные шаблоны и, таким образом, дают долгий путь для обнаружения нарушений во время компиляции и т. Д., Но хорошая «нота» в виде скобок делает почти что угодно. –

ответ

2

Попытка объяснить немного подробнее, чем Dominique в комментариях:

, если вы используете ключевое слово var, переменная действительна только в области, в которой они запущены. Это означает, что после запуска конструктора (тела функции) переменные теряются (поскольку они действительны только внутри конструктора).

Если вы хотите получить доступ к переменным вне конструктора (например, членам-методам), вам необходимо привязать переменные к самому классу с помощью ключевого слова this. Теперь их объем - это сам класс, а не только конструктор.


Edit:

Объясняя далее: в то время как вы можете использовать переменные, объявленные с var внутри методов, которые также объявлены внутри конструктора, так как они определены в той же области (см пример вопроса), невозможно получить к ним доступ через любые другие добавленные методы, которые вы добавляете через Function.prototype.

Чтобы показать это, я создал немного JSFiddle example

Так что, как правило, лучше практика, чтобы определить все переменные класса (что вы не только намерение использовать в качестве временных переменных внутри конструктора) с this ключевое слово.

+0

Майкл, просто протестировал эту теорию, но кажется, что переменные, объявленные с помощью var, на самом деле видимы для методов-членов, как и те, которые были объявлены с этим. Измените примеры в оригинальном посте, чтобы продемонстрировать. – NickC

+1

@NickC да, но это только потому, что вы определили метод в той же области (конструктор). Посмотрите на эту скрипту, где я попробовал другой метод добавления методов-членов (через прототип): https://jsfiddle.net/oo2gamzn/1/.Хотя он может работать с vars, когда вы определяете методы внутри тела функции, обычно лучше использовать 'this' для переменных, которые используются вне конструктора –

+0

Майкл, спасибо за этот jsfiddle, который полностью объясняет разницу, теперь я понимаю. У меня было ощущение, что есть разница, но я не мог понять, что это было. Cheers, Если вы хотите повторить это как ответ, я могу отметить это как принятое решение. – NickC

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