JS课代表,今天复习私有属性(Private)

85 阅读2分钟

JavaScript中私有属性的实现方法

在JavaScript中,由于它是一种基于原型的语言,通常没有像其他面向对象语言(如Java或C++)那样的私有成员概念。但是,我们可以使用一些设计模式或技巧来模拟私有属性。以下是几种实现私有属性的方法:

使用Symbol

从ES6开始,JavaScript引入了Symbol数据类型。由于Symbol是唯一的,我们可以使用它来模拟私有属性。

const privateSymbol = Symbol('private');

class MyObject {
    constructor() {
        this[privateSymbol] = 'This is private';
    }

    publicMethod() {
        console.log(this[privateSymbol]);
    }
}

const obj = new MyObject();
obj.publicMethod(); // 输出 "This is private"
console.log(obj.privateSymbol); // undefined
console.log(obj[privateSymbol]); // undefined,因为privateSymbol是唯一的

缺点

const objList = Object.getOwnPropertySymbols(obj); // [ Symbol(key) ]

const key = objList[0];

console.log(obj[key]); // "This is private"

命名约定

通过使用特定的命名约定来表示私有属性。例如,将私有属性的名称前面加上下划线 _。这样的命名约定可以提醒其他开发者这些属性是私有的,不应该直接访问。

class MyClass {
  constructor() {
    this._privateProperty = '私有属性的值';
  }

  // 公共方法
  getPrivateProperty() {
    return this._privateProperty;
  }
}

在上面的示例中,_privateProperty 是私有属性,通过 getPrivateProperty 方法来访问和获取其值。

缺点

它只是约定!!!

直接获取就可以得到。

const myData = new MyClass();
console.log(myData._privateProperty);

使用闭包

闭包是实现私有属性的常用方法之一。通过闭包,我们可以创建一个只能在外部函数内部访问的变量,从而模拟私有属性。

function MyObject() {
    var privateVar = 'This is private';

    this.publicMethod = function() {
        console.log(privateVar);
    }
}

var obj = new MyObject();
obj.publicMethod(); // 输出 "This is private"
console.log(obj.privateVar); // undefined,因为privateVar是私有的

使用 ‘#’

MDN 私有属性详细描述

image.png

根据例子,‘#’能够对属性和方法进行私有化,并且可以增加静态标签,例如:

私有属性

class ClassWithPrivateField {
  #privateField;

  constructor() {
    this.#privateField = 42;
  }
}

class SubClass extends ClassWithPrivateField {
  #subPrivateField;

  constructor() {
    super();
    this.#subPrivateField = 23;
  }
}

new SubClass();
// SubClass {#privateField: 42, #subPrivateField: 23}

私有方法

class ClassWithPrivateMethod {
  #privateMethod() {
    return "hello world";
  }

  getPrivateMessage() {
    return this.#privateMethod();
  }
}

const instance = new ClassWithPrivateMethod();
console.log(instance.getPrivateMessage());
// hello world

注意,该特性对于浏览器版本要求比较高!

image.png

image.png