2016-11-18 84 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