クラスは、es6 で導入された最も重要な機能の 1 つです。クラスが存在する前は、プロトタイプ チェーンを通じてのみクラスをシミュレートできました。この記事では、ES6 で導入された最も重要な機能の 1 つであるクラス キーワードを主に紹介します。この記事では、サンプルコードを通じて詳細に説明しますので、必要な方は参考にしていただければ幸いです。
1. はじめに
//定义类 class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return '(' + this.x + ', ' + this.y + ')'; } }
Point クラスでは、構築メソッドに加えて、toString メソッドも定義されています。 「クラス」メソッドを定義する場合、キーワード function を先頭に追加する必要はなく、関数定義を直接記述するだけであることに注意してください。さらに、メソッドをカンマで区切る必要はありません。カンマで区切らないと、エラーが報告されます。
//类的数据类型就是函数,类本身就指向构造函数。用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致。 class Bar { doStuff() { console.log('stuff'); } } var b = new Bar(); b.doStuff() // "stuff"
2. Strict モード
クラスとモジュール内では、デフォルトは strict モードであるため、実行モードを指定するために use strict を使用する必要はありません。コードがクラスまたはモジュールに記述されている限り、厳密モードのみが利用可能です
3. コンストラクター メソッド
コンストラクター メソッドは、オブジェクト インスタンスが生成されるときに自動的に呼び出されます。新しいコマンド。クラスにはコンストラクター メソッドが必要です。明示的に定義されていない場合は、デフォルトで空のコンストラクター メソッドが追加されます。
class Point { } // 等同于 class Point { constructor() {}//constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。 } //注意:类必须使用new调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以执行。
4. クラスのインスタンスオブジェクト
クラスのインスタンスオブジェクトを生成するには、 new コマンドを使用します。
インスタンスの属性がそれ自体で明示的に定義されていない限り(つまり、このオブジェクトで定義されている)、それらはプロトタイプで定義されています(つまり、クラスで定義されています)。
class Point { // ... } // 报错 var point = Point(2, 3); // 正确 var point = new Point(2, 3);
5. クラス式
次のコードは、式を使用してクラスを定義します。このクラスの名前は Me ではなく MyClass であり、Class の内部コードでのみ使用可能であり、現在のクラスを参照していることに注意してください。
const MyClass = class Me { getClassName() { return Me.name; } }; //采用 Class 表达式,可以写出立即执行的 Class。 var person = new class { constructor(name) { this.name = name; } sayName() { console.log(this.name); } }('张三'); person.sayName(); // "张三"
6. 変数 hoist がありません
クラスに変数 hoist (ホイスト) がありません。 以下のコードでは、Foo クラスが最初に使用され、後で定義されます。これは、ES6 ではホイストされないため、エラーが発生します。コードヘッドにクラス宣言を追加します。この規定の理由は、後述する継承に関連しており、サブクラスが親クラスの後に必ず定義されるようにする必要があります。
new Foo(); // ReferenceError class Foo {}
7. プライベート メソッド
プライベート メソッドは一般的な要件ですが、ES6 にはプライベート メソッドが用意されておらず、回避策によってのみシミュレートできます。
プライベートメソッドの追加
①ネーミングの違い。
②Symbol値の一意性を利用して、プライベートメソッドにSymbol値の名前を付けます。
/*命名上加以区别*/ class Widget { // 公有方法 foo (baz) { this._bar(baz); } // 私有方法 _bar(baz) { return this.snaf = baz; } // ... } /*利用Symbol*/ const bar = Symbol('bar'); const snaf = Symbol('snaf'); export default class myClass{ // 公有方法 foo(baz) { this[bar](baz); } // 私有方法 [bar](baz) { return this[snaf] = baz; } // ... };
8. プライベート プロパティ
プライベート メソッドと同様に、ES6 はプライベート プロパティをサポートしません。現在、プライベート属性をクラスに追加することが提案されています。属性名の前に # を付ける方法です。
class Point { #x; constructor(x = 0) { #x = +x; // 写成 this.#x 亦可 } get x() { return #x } set x(value) { #x = +value } }
9. これのポイント
クラスメソッドにこれが含まれている場合、デフォルトでそのクラスのインスタンスを指します。
この方法を単独で使用すると、エラーが報告される可能性があります。class Logger { printName(name = 'there') { this.print(`Hello ${name}`); } print(text) { console.log(text); } } const logger = new Logger(); const { printName } = logger; printName(); //上面代码中,printName方法中的this,默认指向Logger类的实例。但是,如果将这个方法提取出来单独使用,this会指向该方法运行时所在的环境,因为找不到print方法而导致报错。 /*解决方法是,在构造方法中绑定this,这样就不会找不到print方法了。*/ class Logger { constructor() { this.printName = this.printName.bind(this); } // ... }
本質的に、ES6 クラスは ES5 コンストラクターのパッケージング層にすぎないため、name 属性を含む関数の多くの機能がクラスによって継承されます。
class Point {} Point.name // "Point"
以上がES6のclassキーワードの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。