如何让一个对象具有私有属性?

63 阅读2分钟

"```markdown 如何让一个对象具有私有属性?

在 JavaScript 中,对象的属性默认是公开的,即可以通过对象的引用直接访问和修改。然而,有时我们希望将某些属性设置为私有的,只允许在对象内部访问和修改。下面是几种实现私有属性的方法:

  1. 闭包

使用闭包可以创建私有属性。通过在构造函数内部定义变量,然后在构造函数返回的闭包函数中访问和修改这些变量,可以实现私有属性的效果。

function Person() {
  var privateVar = '私有属性';
  
  this.getPrivateVar = function() {
    return privateVar;
  };
  
  this.setPrivateVar = function(value) {
    privateVar = value;
  };
}

var person = new Person();
console.log(person.getPrivateVar()); // 输出:私有属性
person.setPrivateVar('修改后的私有属性');
console.log(person.getPrivateVar()); // 输出:修改后的私有属性
  1. Symbol

Symbol 是 JavaScript 中一种唯一且不可改变的数据类型。我们可以使用 Symbol 创建一个唯一的键,将其作为对象的属性名,从而实现私有属性的效果。

var privateVar = Symbol('私有属性');

var obj = {
  [privateVar]: '私有属性值',

  getPrivateVar: function() {
    return this[privateVar];
  },

  setPrivateVar: function(value) {
    this[privateVar] = value;
  }
};

console.log(obj.getPrivateVar()); // 输出:私有属性值
obj.setPrivateVar('修改后的私有属性值');
console.log(obj.getPrivateVar()); // 输出:修改后的私有属性值
  1. WeakMap

WeakMap 是 ES6 中的一种数据结构,它可以存储键值对,并且键是弱引用的。我们可以使用 WeakMap 来存储私有属性,从而实现私有属性的效果。

var privateVar = new WeakMap();

function MyClass() {
  privateVar.set(this, '私有属性值');
}

MyClass.prototype.getPrivateVar = function() {
  return privateVar.get(this);
};

MyClass.prototype.setPrivateVar = function(value) {
  privateVar.set(this, value);
};

var myObj = new MyClass();
console.log(myObj.getPrivateVar()); // 输出:私有属性值
myObj.setPrivateVar('修改后的私有属性值');
console.log(myObj.getPrivateVar()); // 输出:修改后的私有属性值

通过以上三种方法,我们可以实现在 JavaScript 中创建具有私有属性的对象,从而实现封装和保护对象的数据。