在JavaScript中的类-公共、私有和受保护的

原始地址:https://dev.to/bhagatparwinder/classes-in-js-public-private-and-protected-1lok

虽然ES6引入了class关键字,可以模拟类并允许我们进行面向对象编程,但JavaScript缺少创建类中公共(public)、私有(private)和受保护(protected)成员的能力。
如果你使用过任何面向对象的语言,你一定知道内部接口和外部接口的重要性。内部接口指的是类的方法和属性,只能由类自身访问,而不能从外部访问。相反,外部接口具有可在类外部访问的方法和属性。
主要的三个关键字是public、protected和private。

  • Public:类的成员对于可以访问该(拥有者)类实例的所有人都是可用的。
  • Private:这些成员只能在实例化对象的类内部访问。
  • Protected:这个关键字允许比private成员更多的访问权限,但比public的要少得多。受保护的成员在类内部(类似于private)和继承自它的任何对象中都可以访问。受保护的值在原型链的所有层次上都是共享的。其他人无法访问受保护的值。
    受保护的关键字是这三个关键字中最难在JavaScript中模拟的。

链接
Public
这是JavaScript的默认特性。如果某个对象可以访问另一个对象,它将可以访问该对象的成员。例如:
const myObject = {
name: “Parwinder”,
sayMyName: function () {
return this.name;
}
}
console.log(myObject.name); // Parwinder
console.log(myObject.sayMyName()); // Parwinder
在上面的示例中,我可以无问题地访问属性和方法。如果你更喜欢使用类语法:
class ObjectCreator {
name;
constructor(name) {
this.name = name;
}
sayMyName() {
return this.name;
}
}
const myObject = new ObjectCreator(“Parwinder”);
console.log(myObject.name); // Parwinder
console.log(myObject.sayMyName()); // Parwinder

链接
Private
在JavaScript中创建私有变量有多种方法。第一种是使用闭包。
function carMonitor() {
var speed = 0;
return {
accelerate: function () {
return speed++;
}
}
}
var car = new carMonitor();
var redCar = new carMonitor()
console.log(car.accelerate()); // 0
console.log(car.accelerate()); // 1
console.log(redCar.accelerate()); // 0
console.log(redCar.accelerate()); // 1
console.log(car.accelerate()); // 2
console.log(redCar.accelerate()); // 2
console.log(speed); // speed未定义
car和redCar维护自己的私有speed变量,speed在外部不可访问。我们强制消费者使用函数或类上定义的方法,而不是直接访问属性(这是他们不应该做的)。这就是封装代码的方式。
第二种方法是使用#符号。
class ObjectCreator {
#meaningOfLife;
constructor(name) {
this.#meaningOfLife = 42;
}
returnMeaningOfLife() {
return this.#meaningOfLife;
}
#returnAMessage() {
return “You will do great things in life”;
}
}
const myObject = new ObjectCreator(“Parwinder”);
console.log(myObject.returnMeaningOfLife()); // 42
console.log(myObject[“#meaningOfLife”]); // undefined
console.log(myObject.#meaningOfLife); // SyntaxError
console.log(myObject.#returnAMessage); // SyntaxError
语言实施了封装。在其作用域外引用#名称是语法错误。公共字段和私有字段不冲突。我们可以在同一个类中拥有私有字段#meaningOfLife和公共meaningOfLife字段。
🚨声明类的私有成员的#方法是ES2019/ES10的一部分。

链接
Protected
正如我在本文开始所说的,protected是JavaScript中最难实现的3个关键字之一。我能想到的唯一一种实现方式是使用一个具有没有setter的属性getter的类。该属性将是只读的,并且任何对象都将从类中继承它,但只能在类内部进行更改。
🙏 如果你有创建类的受保护成员(或者尽可能接近受保护的成员)的示例,请分享出来!
class NameGenerator {
_name;
constructor(name) {
this._name = name;
}
get name() {
return this._name;
}
}
let nameGenerator = new NameGenerator(“John”);
console.log(我的名字是${nameGenerator.name}); // My name is John
nameGenerator.name = “Jane”; // 无法分配到’name’,因为它是一个只读属性。
‘’’

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值