2016-07-03 10 views
2

Привет, сообщество это простой вопрос.Js OOP: частная переменная из класса

Может кто-нибудь сказать мне, почему эта печать не определена?

function Person(first,last,age) { 
 
    this.firstname = first; 
 
    this.lastname = last; 
 
    this.age = age; 
 
    var bankBalance = 7500; 
 
} 
 

 
// create your Person 
 
var john = new Person ('John','Doe',33); 
 

 
// try to print his bankBalance 
 
document.write (john.bankBalance);

В последней строке я хочу напечатать john.bankBalance Wich 7500 Спасибо!

+0

Поскольку 'john' не имеют свойство 'bankBalance'. Переменная 'bankBalance' в функции конструктора' Person' недоступна вне нее (из-за правил определения области JavaScript.) Кроме того, JS не поддерживает языковую поддержку для частных свойств; хотя для их имитации можно использовать замыкания. –

+0

Одна вещь, которая стоит иметь в виду для начинающих, заключается в том, что в JS нет «класса». Вместо этого JS использует прототипы. Когда вы выполняете 'var bankBalance', он не похож на Java, который объявляет свойство-член, он определяет только локальную переменную. Чтобы добавить свойство, вы должны фактически изменить свойство экземпляра ('this.bankBalance') или изменить его через прототип (' Person.prototype.bankBalance = 7500'). –

+0

Спасибо всем. Теперь я немного знаю, как работает Js –

ответ

0

Это из-за характеристики Javascript, известной как закрытие. В основном это означает, что если объекты вложены, тогда внутренние объекты могут обращаться к переменным только из объектов вне их. Используя это ключевое слово, вы по существу превращаете переменную в свойство этого объекта. Переменные, объявленные с помощью var, не будут доступны для объектов, которые выложили метод. Для интересного чтения, пожалуйста, проверьте эту ссылку

http://javascript.crockford.com/private.html

Вот пример объекта с частным переменным и некоторыми общедоступными методами и собственностью. Эти характеристики полезны, поскольку они ограничивают использование объекта. В этом примере ниже мы не хотим разработчиков подделки с массивом, чтобы мы могли просто дать им объект, чтобы добавить, средство для удаления, и они могут видеть только четные индексы: -

function SpecialArray() { 

    var _array = []; 

    this.length = _array.length; 

    this.add = function(stuff) { 
     // add some stuff to it 
    } 

    this.remove = function(stuff) { 
     // take some stuff out of it 
    } 

    this.displayEvenNumbers = function(){ 
     for (var i=0; i< _array.length ; i+=2){ 
      console.log(_array[i]); 
     } 
    } 
} 
0

bankBalance, поскольку вы написали его, только для конструктора. Если вы хотите получить к нему доступ в качестве переменной экземпляра, вам необходимо объявить его как у вас с this.firstname et. и др.

1

bankBalance доступен только в области функций. Если вы хотите публично получить доступ, вы должны определить с помощью «this», как вы это делали с именем и именем.

1

Вы должны добавить this из-за объема bankBalance только в конструктор. Вы можете сделать это:

this.bankBalance = 7500; 

В качестве альтернативы, вы можете создать геттер/сеттер для bankBalance так:

this.getBalance = function() { 
    return bankBalance; 
} 

this.setBalance = function(balance) { 
    bankBalance = balance; 
} 

Вот JSFiddle демонстрирует функции с добытчиками и сеттеров для локальной переменной bankBalance ,

Вот еще JSFiddle с переменной «public» bankBalance, к которой можно получить доступ как переменную экземпляра.

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