js实现私有属性

第一种方式:

用一个下划线或字符串的方式

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...infor...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;
}());

js实现私有属性

上一篇:1001. A+B Format (20)


下一篇:Metasploit简单使用——复现永恒之蓝漏洞