背景を行うには、クラスの概念が唯一のインスタンスオブジェクトを生成するコンストラクタを使用することができ、他のオブジェクト指向言語の違いの多くのJavaScriptクラスに非常に精通している必要があります。伝統的な言語にアクセスするには、ES6はクラスキーワード、カテゴリによって定義され、この概念のようなクラスを導入しました。
クラスは、ほとんどすべての機能は、オブジェクト指向プログラミングのように、単にコードをより明確にするために、他の方法で達成することができ、実際にシンタックスシュガーです。
構文:
class User{
constructor(){ console.log('默认调用'); } eat(){ console.log('eat方法'); } } var user = new User();//默认调用 user.eat()//eat方法
クラスメソッドは、カンマで区切っすることができない、または機能との間の誤差になることに注意してくださいは、キーワードやメソッドを追加することはできません。すべてのメソッドは、クラスのプロトタイプのクラスメソッドで定義されています。クラスのインスタンスでは、プロトタイプのメソッド呼び出しのメソッドを呼び出すことです。
class User{
eat(){} }
それはと同等です。
function User() {} User.prototype.eat = function () {}
内部クラスの定義方法はES5と同じではないである、列挙されません。
コンストラクタメソッド:
これは自動的にヌルコンストラクタを追加し、各クラスがありますため、明示的に定義されていない場合は、によって自動的に呼び出さオブジェクトの新しいインスタンスを生成するデフォルトの方法です。デフォルトでは、このているオブジェクトのインスタンスを返します。あなたはまた、コンストラクタと同じである他のオブジェクトを返すことができます。クラスは、新しいコールを使用しなければならない、と我々はコンストラクタメソッドは、直接呼び出すことができますよう。
属性インスタンスとしてES5明示的(すなわち、クラスに定義されている)(すなわち、このオブジェクトで定義されて)それ自体の定義、またはプロトタイプ上で定義されていない限り、クラス共有のすべてのインスタンスプロトタイプオブジェクト、したがって一例プロトタイプによるオブジェクトプロト書き直しプロトタイプは、オブジェクトのすべてのインスタンスを変更します、のすべてのインスタンスにはお勧めしませんプロトプロトタイプを書き換えます。
同じ、getter関数とsetter関数は、クラス内で設定しますキーワードで使用することができます。
class User{
constructor(){ this.name = 'wade'; } get eat(){ return '这是get'; } set eat(val){ console.log('set调用了'); } } var user = new User(); user.eat = 3//set调用了 console.log(user.eat);//这是get
式:
プロパティは、[]の式を使用することができ、これはオブジェクトと同じで、クラスも直接式で定義することができます。
var val = 'my'
var User = class Muser{ [val](){ } }
MUSERは唯一のクラス、クラス外用ユーザー内で使用可能です。内部が使用されていない、またはMUSERクラスを省略することができる場合はすぐに実行します。
var User = class {} var user = new class{}()
注意することは、デフォルトのクラスは、strictモードですが、また、属性名は、classキーワードのクラス名の後に返される変数が存在しない高め、あなたもGerneratorメソッドを使用することができます。このクラスのメソッドの内部のデフォルトのインスタンスは、別々のアウト・エラーを使用して、クラスを指示しました。
キーワードstaticメソッドを持つクラスの前では、このメソッドはクラスを呼び出すことで、インスタンスを継承することはできません、このメソッドは静的メソッドと呼ばれています。
class User{
static eat(){ console.log('eat'); } }var user = new User(); console.log(user.eat());//报错 User.eat()//eat
静的メソッドは、このキーワードが含まれている場合は、この手段その代わりに、インスタンスのこのクラス:
class User{
static eat() { this.say(); } static say() { console.log('hello'); } say() { console.log('world'); } } User.eat() // hello
静的メソッドと非静的メソッドも重複した名前をすることができます。静的メソッドはサブクラスに継承することができます。
コンストラクタの内部でインスタンスのプロパティを定義するだけでなく、直接トップレベルで定義されました。
class User1{
constructor(){ this.name = 'wade'; } } class User2{ name = 'kobe'; } console.log(new User1().name);//wade console.log(new User2().name);//kobe
クラスプロパティ自体は、Class.propName、静的クラスのプロパティと呼ばれるこのオブジェクトのインスタンスのプロパティが定義されていません。内部クラスの静的メソッド、静的プロパティだけではなく、今は1回の書き込みです。
クラスユーザー{}; User.prop = 1。
しかし、静的な定義を使用する提案があります:
class User{
static prop = 1; };
ビューのコードポイントから組織原理と宣言は、言葉遣いは間違いなく優れています。
我々は、すべてのコードのパッケージ私有財産を知っているし、民間の方法は非常に重要ですが、ES6クラスが提供されていません。このような識別名、除去方法のためのモジュール、および可変記号付き等の代替ソリューション。しかし、非常に良好ではありません。今、私有財産を提供するために、#を使用するための提案があります:
class User{
#prop = 1;
#eat(){} };
エラー時に外部からアクセス可能な、内部でのみ使用することができます。プライベートプロパティもgetterメソッドとsetterメソッドを設定することができます。この参照からプライベート属性が長いクラスのインテリアとして、インスタンスを参照することができるプライベート属性として、これらに限定されません。
class User{
#prop = 1;
static eat(user){ console.log(user.#prop); } }; User.eat(new User());//1
オブジェクトの新しいインスタンスは、コンストラクタからのコマンドを生成することです。一般コンストラクタで使用される新しいコマンドnew.target性のES6導入はコンストラクタその旨を新しいコマンドを返します。コンストラクタは、新しいコマンドまたはReflect.constructによって()の呼び出しではない場合、このプロパティは、コンストラクタが呼び出された方法を決定するために使用することができますので、new.targetは、未定義返します。
function User() { console.log(new.target === User);//true console.log(new.target !== undefined);//true } var user = new User();
それは新しいものではありません場合:
function User() { console.log(new.target === User);//false console.log(new.target !== undefined);//false } User();
クラス内部コールnew.target、現在のクラスを返します。
class User{
constructor(){ console.log(new.target === User)//true } } new User();
サブクラスは親クラスを継承すると、new.targetは、サブクラスを返します。この機能を使用すると、クラス必見の継承を使用することができた後、独立して使用することはできません書くことができます。