2015-05-03 4 views
0

У меня есть простая проблема, но я не могу понять.Проблема прототипа

<script type="text/javascript"> 

var man = function(){ 

    var age = 1; 

    this.shoes = 2; 

}; 

man.prototype = { 

    create: function(){ 

     //age = 5; 
     console.log(age); 
     console.log(this.shoes); 

    } 

} 
var man1 = new man; 
man1.create(); 
</script> 

-Ok, я создаю человека с 2 варами, возрастом и ботинками. Я использую «это» только в обуви. После того как я прототип метода в человеке.

-Если я выполняю этот код, первый console.log говорят мне:

Uncaught ReferenceError: возраст не определен (логика)

И вторая консоль "2" (правильно).

-Если я пишу: console.log (this.age) ошибка сообщения: undefined.

-Но если я ставлю значение для возраста (возраст = 5) (без использования «var» для создания var) в новом методе, он работает.

Почему я могу использовать только возраст var, если я ставлю значение, прежде чем читать это, но?

+0

Сфера применения. Вы не можете получить доступ к своей прототипной функции. Однако перемещение его вне вашего конструктора делает его доступным. Определение «age = 5» в прототипе фактически не изменяет вашу первую переменную «возраст», потому что она защищена. – Michelangelo

ответ

2

Возрастная переменная находится в закрытии «конструкторов», что делает ее доступной только там. Вы можете использовать переменную возраста внутри этой функции (закрытие), но не снаружи.

Если вы хотите сделать это, доступную извне, добавить его к этому или сделать функцию геттер, как:

var man = function(){ 
    var age = 1; 
    this.shoes = 2; 
    this.getAge = function() { return age; }; 
}; 

Но если вы не поставите объявить переменную внутри функции, но все-таки установить его , то он будет определен на глобальном объекте, в браузере window. Это не сделает возраст доступным для объекта man, но вы получите доступ к нему в любом месте. Вот прояснить немного:

function tellAgeDelayedGlobal() { 
    age = 1; 
    setTimeout(function() { console.log(age) }, 1000); 
} 

function tellAgeDelayedDeclared() { 
    var age = 1; 
    setTimeout(function() { console.log(age) }, 1000); 
} 

tellAgeDelayedGlobal(); 
tellAgeDelayedDeclared(); 
age = 2; 

это будет печатать на консоли:

2 
1 
+0

О, просто прочитайте описание еще раз и посмотрите, что я не отвечаю на вопрос.Исправит –

+0

Хорошо, я понимаю, проблема в том, что я все время думал, что переменные могут инициировать только с «var», но не без. ;) – Phyron

+0

Продлил мой ответ с объяснением причин, почему не объявление переменной в функции делает ее доступной повсюду. –

2

При использовании var внутри функции она доступна в нем (местный охват).

var man = function(){ 

    var age = 1; 

    this.shoes = 2; 

}; 

Здесь age будет доступен только в man метода/конструктора, так как это создает локальную область или, скорее, является private в конструктор.

man.prototype = { 

    create: function(){ 

     age = 5; 
     console.log(age); 
     console.log(this.shoes); 

    } 

} 

Здесь age создаст глобальную область видимости. То есть, это эквивалентно window.age = 5 и, следовательно, делает его доступным во всем приложении. Из-за чего вы сможете получить значение в любой функции, так как теперь оно глобально.

Этого следует избегать, поскольку он не будет автоматически собираться с мусором (GC). Если вам это действительно нужно, потому что другие части вашего кода имеют зависимость w.r.t. это, вы можете прописать его как: MyApp.age = 5. Но, в вашей нынешней ситуации, я не нахожу здесь нужды.

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