字段
类字段直接在类的正文内声明,而不是显式声明
作为 this
值的属性添加。不过,结果是一样的:
属性。
class MyClass {
myField;
}
const myClassInstance = new MyClass();
myClassInstance;
> MyClass { myField: undefined }
您可以使用值初始化字段。这通常是默认值 类中的逻辑可以覆盖以下内容:
class MyClass {
myResult = false;
set setValue( myValue ) {
this.myResult = myValue;
}
}
const myClassInstance = new MyClass();
myClassInstance;
> Object { myResult: false }
myClassInstance.setValue = true;
myClassInstance;\
> Object { myResult: true }
类字段在功能上与附加到类的属性相同
使用 this
。也就是说,用户无需
类与其他任何属性一样。
class MyClass {
myField = true;
}
const myClassInstance = new MyClass();
myClassInstance.myField;
> true
myClassInstance.myField = false;
myClassInstance.myField;
> false;
字段是类的一些更高级功能的基础。
私有字段和方法
Private 字段和方法在类之外不可访问。私有 属性与类的实例相关联,这意味着每个实例 包含它自己的一组私有字段和方法(如类中所定义)。
若要将属性设为私有,请在访问时将 #
添加到标识符的开头,
声明它:
class MyClass {
#myPrivateField = true;
#myPrivateMethod() {}
}
const myClassInstance = new MyClass();
myClassInstance;
> MyClass { #myPrivateField: true }
#myPrivateField: true
<prototype>: Object { … }
constructor: class MyClass {}
<prototype>: Object { … }
必须在所属类的正文中声明私有字段。您可以
稍后将其值更改为 this
的属性,但您无法创建该字段
使用 this
。
无法从脚本中的其他位置访问不公开字段。这会阻止数据 属性在提供的 getter 和 setter 方法之外发生更改 与其包含的值进行交互,并且这会阻止直接访问 方法仅适用于类本身。
class MyClass {
#myResult = false;
set setValue( myValue ) {
this.#myResult = myValue;
}
}
const myClassInstance = new MyClass();
myClassInstance;
> MyClass { #myResult: false }
myClassInstance.#myResult = true;
> Uncaught SyntaxError: reference to undeclared private field or method #myResult
myClassInstance.setValue = true;
myClassInstance;\
> MyClass { #myResult: true }
但请注意开发者控制台 非常宽松 虽然不一致,但关于允许访问私有字段进行调试 用途:
class MyClass {
#myPrivateField = true;
#myPrivateMethod() {
console.log( "This is inside a private method." );
}
}
const myClassInstance = new MyClass();
myClassInstance;
> MyClass {#myPrivateField: true}
myClassInstance.#myPrivateField;
> true
myClassInstance.#myPrivateMethod();
> "This is inside a private method."
class MyClass {
#myPrivateField = true;
#myPrivateMethod() {
console.log( "This is inside a private method." );
}
}
const myClassInstance = new MyClass();
myClassInstance;
> MyClass {#myPrivateField: true}
myClassInstance.#myPrivateField;
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateField
myClassInstance.#myPrivateMethod();
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateMethod
私有字段的作用域严格限定为包含这些字段的类的正文, 这意味着,即使是子类也无法访问与 父类:
class MyClass {
#myPrivateField = true;
}
class ChildClass extends MyClass {
childMethod() {
console.log( this.#myPrivateField );
}
}
> Uncaught SyntaxError: reference to undeclared private field or method #myPrivateField
静态字段和方法
静态字段和方法是类本身的成员,而不是 实例。因此,静态字段提供了一个集中的 每个类的每个实例的数据都不是唯一的, 例如,共享的配置信息。 静态方法通常是处理 类,例如根据实例包含的字段对实例进行比较或排序。
如需在类正文中定义静态字段和方法,请使用 static
关键字:
class MyClass {
static myStaticField;
static myStaticMethod() {}
}
const myClassInstance = new MyClass();
您还可以使用点表示法创建静态方法:
class MyClass {
constructor() {}
}
MyClass.myStaticMethod = function() {}
您不能从其类的一个实例访问静态属性,但它们 (用于类构造函数):
class MyClass {
static myStaticField = true;
static myStaticMethod() {
console.log( "A static method." );
}
}
const myClassInstance = new MyClass();
myClassInstance.myStaticField;
> undefined
myClassInstance.myStaticMethod();
> Uncaught TypeError: myClassInstance.myStaticMethod is not a function
MyClass.myStaticField;
> true
MyClass.myStaticMethod();
> "A static method."
它们在技术上并不是必需的,但对于 创建用于处理类实例的实用程序例如, 包含专用于对类的实例进行排序的静态方法, 工厂方法,其中包含创建 类,然后返回类实例:
class User {
constructor( name, email ) {
this.name = name;
this.email = email;
}
static fromObject( myObject ) {
return new User( myObject.name, myObject.email ?? "Omitted" );
}
}
const userObject = {
"name" : "My Name",
"email" : "my@email.address"
};
const secondUserObject = {
"name" : "My Name"
};
const firstUser = User.fromObject( userObject );
const secondUser = User.fromObject( secondUserObject );
firstUser;
> Object { name: "My Name", email: "my@email.address" }
secondUser;
> Object { name: "My Name", email: "Omitted" }
检查您的理解情况
以下哪些类型的字段只能通过 该怎么办?
Static fields