第一种方式:
用一个下划线或字符串的方式
var User = (function () {
let _name = `_name`
// 或者 let _name = ‘m24OR98kORawm1314520‘
function User(name) {
this[_name] = name;
}
User.prototype.getName = function () {
return this[_name];
};
return User;
}());
缺点:并不是真正意义上的私有,依然可以使用Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify
获取到属性
第二种方式:
使用闭包
var User = (function() {
function User(name) {
this.getName = function() {
return name;
};
}
return User;
}());
缺点:是真正的私有,但是实例无法共享方法,浪费内存空间
第三种方式:
使用Symbol
var User = (function () {
var nameSymbol = Symbol(‘name‘);
function User(name) {
this[nameSymbol] = name;
}
User.prototype.getName = function () {
return this[nameSymbol];
};
return User;
}());
缺点:会被Object.getOwnPropertySymbols
获取到属性,进而修改该属性对应的值(Symbol 作为属性名,该属性不会出现在for...in
、for...of
循环中,也不会被Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
返回。但是,有一个Object.getOwnPropertySymbols
方法,可以获取指定对象的所有 Symbol 属性名。)
第四种方式:
基于闭包+map的实现
var User = (function () {
var map = new Map();
function User(name) {
map.set(this, name);
}
User.prototype.getName = function () {
return map.get(this);
};
return User;
}());