2017-04-04 14 views
0

ES6クラスでは、getterプロパティとsetterプロパティがありますが、フィールドオプションはありません(少なくとも私が知っている限り)。JSクラスフィールド

Object.definePropertyを使用すると、valueプロパティでそれらを設定することができます。まったくの場合、どのようにクラスで同じことをしますか?

私はそれは、クラスのコンストラクタで行うことができます承知だけど、可能であれば、それは別のことをするために私がしたいと思います。

+0

私はこの質問を理解していないあなたはそれをクラスで行うことができる方法」の例を与えることができます。コンストラクタ」私たちは、 'this.whatever =、あなたはクラスのコンストラクタで – lonesomeday

+0

@lonesomeday探しているものを見ることができる『someValueの』;?' – Spedwards

+1

ですから、オブジェクトのプロパティを意味する? 『クラスのフィールドは、』 JSに存在する概念ではありません。 – lonesomeday

答えて

3

「あなたは言語にかかわらず同じものです。

まあ、はい、いいえ。

はい、プログラミング言語の間に明確な関係がありますが、JavaScript/ECMAScriptのは、いくつかの異常な機能を備えています。正確に翻訳するためのコンセプトを期待するだけではありません。

重要なのは、それがクラスのような構文を持っていないにもかかわらず、Javascriptがクラスベースではないということです。プロトタイプベースです。つまり、任意のオブジェクトのプロパティを宣言できます。クラス宣言に含める必要はありません。

このため、「クラスフィールド」はES6標準には含まれていませんでした。 constructorメソッドにそれらを含めることが期待されていました(ES6以前のJavascriptでは正常です)。

public class fieldsを作成するための提案があります。これらは、このようになります:重要なことは、すべての「インスタンス」は、同じメソッドを持っていることである

let benji = new Dog('Benji'); 
let rover = new Dog('Rover'); 
console.log(benji.bark === rover.bark); // true 
console.log(benji.tail === rover.tail); // false 

class Dog { 
    constructor(name) { 
    this.name = name; 
    } 
    bark() { 
    console.log('woof'); 
    } 
    tail = new Tail() 
} 

あなたは、このように見えたコードを持つことができます。ただし、各インスタンスは異なるプロパティを持ちます。これは、なぜこの構文が最初に含まれていなかったのかを説明する違いです。

提案として、これは現在サポートされていません。ただし、蒸散を使用して使用することができます。 Babel.js(と、私が書くように、第2段階のプリセットは、このに上記のコードをtranspiles:

class Dog { 
    constructor(name) { 
    this.tail = new Tail(); 

    this.name = name; 
    } 
    bark() { 
    console.log('woof'); 
    } 
} 
+0

翻訳されたコードの 'name'はどこから来ましたか? – Bergi

+0

@Bergi私のオリジナルコードの少し後のバージョン。今修正されました。 – lonesomeday

+0

ありがとうございます。無意味なクラスフィールドがどのように:-) – Bergi

関連する問題