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是私有的
使用 ‘#’
根据例子,‘#’能够对属性和方法进行私有化,并且可以增加静态标签,例如:
私有属性
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
注意,该特性对于浏览器版本要求比较高!