把變量放到構造函數裡進行私有化,每一個實例都會有一個getName方法,這是低效率的。
function Person(name) {
this.getName = function() {
return name;
};
}
改進,把私有成員數據存到實例上去(把實例保存起來,分配唯一的id),但是問題在於即使實例被垃圾回收那些數據永遠保存著。
var Person = (function() {
var privateData = {},
privateId = 0;
function Person(name) {
Object.defineProperty(this, "_id", { value: privateId++ });
privateData[this._id] = {
name: name
};
}
Person.prototype.getName = function() {
return privateData[this._id].name;
};
return Person;
}());
使用weakmap:
var Person = (function() {
var privateData = new WeakMap();
function Person(name) {
privateData.set(this, { name: name });
}
Person.prototype.getName = function() {
return privateData.get(this).name;
};
return Person;
}());