Try   HackMD

Encapsulate Variable

練習用的 REPL

let defaultOwner = {firstName: "Martin", lastName: "Fowler"}; let spaceshipOwner = defaultOwner; // 只要有人這樣使用 defaultOwner.firstName = "Rebecca"; // 就會意外改到變數內容 defaultOwner.lastName = "Parsons";

把直接存取的邏輯封裝起來。

let defaultOwner = {firstName: "Martin", lastName: "Fowler"}; function getDefaultOwner() {return defaultOwner;} function setDefaultOwner(arg) {defaultOwner = arg;} // 呼叫端就可以這樣用 spaceshipOwner = getDefaultOwner(); setDefaultOwner({firstName: "Rebecca", lastName: "Parsons"});

除了單純封裝之外,還可以做的更多。

// 把程式挪到另外獨立檔案,然後後只 export 存取方法出來 let defaultOwner = {firstName: "Martin", lastName: "Fowler"}; export function getDefaultOwner() {return defaultOwner;} export function setDefaultOwner(arg) {defaultOwner = arg;} // 改個名字 let defaultOwnerData = {firstName: "Martin", lastName: "Fowler"}; export function defaultOwner() {return defaultOwnerData;} export function setDefaultOwner(arg) {defaultOwnerData = arg;} // 回傳新的物件 let defaultOwnerData = {firstName: "Martin", lastName: "Fowler"}; export function defaultOwner() {return Object.assign({}, defaultOwnerData);} export function setDefaultOwner(arg) {defaultOwnerData = arg;} // 沒有 setter,任何嘗試修改內容會出錯 let defaultOwnerData = {firstName: "Martin", lastName: "Fowler"}; export function defaultOwner() {return new Person(defaultOwnerData);} export function setDefaultOwner(arg) {defaultOwnerData = arg;} class Person { constructor(data) { this._lastName = data.lastName; this._firstName = data.firstName } get lastName() {return this._lastName;} get firstName() {return this._firstName;} // and so on for other properties }