上篇我们说,C++类的私有成员,外部(包括子类)是不能直接访问的,需要通过getA()这个方法访问,getA()叫做ClassA的getter方法(至于为什么叫getter,不清楚)。Java中也有类似不成文的规定:如果要访问一个类的private成员,就需要写getter方法。
C#甚至专门有一种叫“property”的语法,实现访问类的私有成员:
//getter写法
public class Student
{
private string name;
public string GetName() {
return name;
}
}
//property写法
public class Student
{
private string name;
public string Name {
get {
return name;
}
}
}
上篇,我们还说了,在JavaScript中,下划线的形式并不能真正将变量变成私有的,你仍可以直接修改它的值:
class ClassA {
constructor(value) {
this._a = value;
}
getA() {
return this._a;
}
}
let obj = new ClassA(100);
obj._a = 1000;
但这不是JavaScript的getter标准写法,标准写法是:
class ClassA {
constructor(value) {
this._a = value;
}
get A() {
return this._a;
}
}
let obj = new ClassA(100);
obj._a = 1000;
但不能通过A(getter)修改值了,而需要使用setter,否认会报Cannot set property A of #<ClassA> which has only a getter(JavaScript严格模式下)
class ClassA {
constructor(value) {
this._a = value;
}
get A() {
return this._a;
};
}
let obj = new ClassA(100);
obj._a = 123;// 仍然可以这样写
obj.A = 123;//不能这样写