2016-11-18 7 views
1

Я всегда думал о закрытии JavaScript как идеальный способ для инкапсуляции данных, что делает частные переменные. Но недавно я понял, что эта модель очень легко нарушаются эксплуатирующей ссылочная семантика:Можно ли обойти закрытие JavaScript для инкапсулирования данных?

function creator() { 
    var x = { 
    key: 3 
    }; 
    return function() { 
    return x; 
    } 
} 

var instance = creator(); 

var y = instance(); 

y.key = 4; 

//returns 4 
//y is a refernce to x 
console.log(instance()); 

Как я могу убедиться, что частная часть (переменная, определенные в рамках creator() не может быть мутировали из-за пределы

ответ

1

вас? . следует использовать getters and setters Следуя примеру MDN вы должны быть в состоянии вернуть то же значение, даже если установлены по-разному:.

function creator() { 
    var x = { 
    get key() { 
     return 4; 
    }, 
    set key(x) { 
     // do nothing 
    } 
    }; 
    return function() { 
    return x; 
    } 
} 

Таким образом, при установке ключа, связующие падает входное значение и сохраняет первоначальное значение инициализации

+0

Спасибо, именно то, что я искал. –

+0

Это нормально, чувак! ;) – morels