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