随着前端开发越来越复杂,对于代码安全性和代码组织的要求也越来越高。在 ES12 中,引入了 Private Methods 和 Private Accessors 的概念来保护类方法。本文将对这两个概念进行详细介绍,并提供示例代码和指导意义。
Private Methods
在 ES6 之前,JavaScript 中的类成员默认都是公有的(public)。也就是说,所有成员都可以从实例对象和子类中访问。这样的设计存在一个问题:一旦类成员被公开,就很难确保其正确性和安全性。因此,需要引入 Private Methods 来保护类方法的访问与使用。
Private Methods 的语法是在方法名前加上井号(#)。例如:
// www.javascriptcn.com code example
class Foo {
#privateMethod() {
// do something
}
publicMethod() {
this.#privateMethod();
}
}在上面的代码中,#privateMethod() 为 Private Method,只能在类内部使用。在 publicMethod() 中,可以通过 this.#privateMethod() 访问并调用 Private Method。
需要注意的是,Private Method 的名称与公有方法一样,是在类的原型上声明的。但是,由于 Private Method 的存在,它们不会被继承或覆盖。这样可以保证类的方法不会被误用或篡改。
Private Accessors
与 Private Methods 类似,Private Accessors 也是为了保护类成员的访问和使用。在 ES12 中,引入了 getter 和 setter 的私有版本,称为 Private Accessors。
Private Accessors 的语法是使用 set 和 get 关键字,并在成员名前加上井号(#)。例如:
// www.javascriptcn.com code example
class Foo {
#name = '';
get #formattedName() {
return this.#name.toUpperCase();
}
set #formattedName(value) {
this.#name = value.toLowerCase();
}
get name() {
return this.#formattedName;
}
set name(value) {
this.#formattedName = value;
}
}在上面的代码中,#name 为类的私有成员;#formattedName 为私有 Accessor,它的值可以通过类的公有方法 name 和 name= 访问。在 #formattedName 中,可以对 #name 进行数据格式化,确保外部对该成员的访问和使用符合类的设计。
与 Private Methods 一样,Private Accessors 也不能被继承或覆盖。需要注意的是,类可以包含公有 Accessors 和私有 Accessors,使用方法与普通的 getter 和 setter 类似。
示例代码
下面是 Private Methods 和 Private Accessors 的示例代码:
// www.javascriptcn.com code example
class Person {
#name = '';
#log() {
console.log(`Name is ${this.#name}`);
}
setName(name) {
this.#name = name;
this.#log();
}
}
const person = new Person();
person.setName('Alice');在上面的代码中,#name 和 #log() 为私有成员和 Private Method,不能从外部访问。在 setName(name) 中设置了 #name 并打印了该值。
下面是 Private Accessors 的示例代码:
// www.javascriptcn.com code example
class Person {
#firstName = '';
#lastName = '';
get #fullName() {
return `${this.#firstName} ${this.#lastName}`;
}
set #fullName(value) {
const [firstName, lastName] = value.split(' ');
this.#firstName = firstName;
this.#lastName = lastName;
}
get name() {
return this.#fullName;
}
set name(value) {
this.#fullName = value;
}
}
const person = new Person();
person.name = 'Alice Smith';
console.log(person.name);在上面的代码中,#firstName 和 #lastName 为私有成员,只能通过私有 Accessor #fullName 访问。在 name 这个公有 Accessor 中,可以通过 #fullName 获取或修改姓名。最后打印了 person 的姓名。
指导意义
Private Methods 和 Private Accessors 可以帮助开发者保护类的方法和数据,避免被外部访问和修改、并确保类的正确性和安全性。它们的引入使得开发者可以更加自由地组织代码,以满足复杂应用的开发需求。
需要注意的是,Private Methods 和 Private Accessors 在开发过程中需要谨慎使用。使用不当会增加代码复杂度、难以调试和维护,并可能影响代码的性能。因此,在实际开发中,应该根据具体情况合理运用 Private Methods 和 Private Accessors,并进行良好的代码组织和设计,以提高代码的可读性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67bc6ec5a231b2b7ede09d08