クラスのフィールドとメソッド

フィールド

クラス フィールドは、明示的に宣言するのではなく、クラスの本体内で直接宣言します。 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 を使用します。つまり、Cloud Storage の外部から 他のプロパティと同様に使用できます。

class MyClass {
    myField = true;
}

const myClassInstance = new MyClass();

myClassInstance.myField;
> true

myClassInstance.myField = false;

myClassInstance.myField;
> false;

フィールドは、クラスの高度な機能の一部の基礎となります。

非公開のフィールドとメソッド

非公開のフィールドとメソッドは、クラスの外部からはアクセスできません。プライベート プロパティはクラスのインスタンスに関連付けられます。つまり、各インスタンスは には、クラスで定義されている、独自の非公開フィールドとメソッドのセットが含まれます。

プロパティを非公開にするには、実行時に ID の先頭に # を追加します。 次のように宣言します。

class MyClass {
    #myPrivateField = true;
    #myPrivateMethod() {}
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass { #myPrivateField: true }
    #myPrivateField: true
    <prototype>: Object {  }
        constructor: class MyClass {}
        <prototype>: Object {  }

プライベート フィールドは、含まれるクラスの本体で宣言する必要があります。Google Chat では 後で 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."

技術的には必須ではありませんが、静的メソッドを使用することがベスト プラクティスです。 クラスのインスタンスを操作するユーティリティを作成するたとえば クラスのインスタンスを並べ替えるための静的メソッド、または静的な ファクトリ メソッドがあり、API のインスタンスを クラスのインスタンスを返します。

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