类字段和方法

类字段直接在类的正文内声明,而不是显式声明 作为 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