2016-05-29 3 views
0

Допустим, у меня есть следующий класс:Доступ «частные» переменные в JavaScript

function MyClass(){ 

    this.public = function(){ 
     console.log(private); 
    }; 

    var private = 10; 
} 


var test = new MyClass; 

test.public(); // logs 10 
test.private; // undefined 

Я хочу знать, могу ли я получить доступ к частной переменной с внешней стороны. Глядя на консоли Chrome, это представляется возможным, так как его контекст показано:

enter image description here

EDIT: Просто чтобы прояснить: я знаю, как правильно выставить его. Просто хочу быть уверенным, что нет никакого хакерского способа получить к нему доступ.

+0

'private' не является свойством объекта' test', доступ к которому можно использовать с помощью символа '.'. Доступ к внутреннему закрытию может быть доступен только внутри закрытия. – Rayon

+0

Во-первых, это не очень хорошая идея, чтобы выставлять частные переменные-члены. Во-вторых, функция не является классом. Пожалуйста, не путайте Javascript с объектно-ориентированным языком. В-третьих, просто создайте что-то вроде IIFE и верните что-то с функцией getter для вашей частной переменной. Проверьте: https://en.wikipedia.org/wiki/Immediately-invoked_function_expression –

+0

Да, я знаю, что это не настоящий класс. Я не использую этот код, я просто хочу знать, возможно ли это или нет. – GBarroso

ответ

4

Ваша private переменная является локальной для этой области функций и внутри Javascript, есть no доступ к переменным внутри области действия вне области. Вы можете ТОЛЬКО получить доступ к нему из области действия. Невозможно обойти это из самого кода Javascript.

Что может сделать отладчик (имеющий доступ к внутренним внутренним элементам виртуальной машины), отличается от обычного Javascript-кода. Отладчик может просматривать внутренние области, но JS-код извне области не может.

Очевидно, что вы можете создать для него аксессуар, но без аксессуаров нет доступа к нему со стороны.

+1

Спасибо, именно то, что я хотел услышать. – GBarroso

2

Переменная private "находится в ловушке" внутри MyClass. Вы не можете получить к нему доступ, если какой-либо код не предоставляет его, как функция «getter».

function MyClass(){ 

    this.getter= function(){ 
     return private; 
    }; 

    var private = 10; 
} 

К сожалению, private is a reserved keyword.

+0

Да, я знаю, как его разоблачить. Я просто хочу знать, есть ли какой-то хакерский способ доступа к нему. – GBarroso

+0

насколько мне известно, нет. Вы всегда можете пойти и попробовать, а затем обновить нас? – Jhecht

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