2017-06-24 9 views
0

私はこのようなクラスがあります:私は同じ時間(何かを有効/無効にする必要はありません)で2つの構文の両方を使用したい同じ名前のオブジェクト内にプロパティ(フィールド)とメソッドを含めることはできますか?

let enabled = false; 
 

 
class List { 
 
    constructor (...args) { 
 
     this.args = args; 
 
    } 
 
    get Count() { 
 
     if (enabled) { 
 
      let _this = this; 
 

 
      return() => _this.args.length;    
 
     } 
 
     
 
     return this.args.length; 
 
    } 
 
} 
 

 
let list = new List('a', true, null); 
 

 
// 'Count' is not a method/function by default 
 
console.log(list.Count); // 3 
 

 
// do something to enable this flag: 
 
enabled = true; 
 

 
// 'Count' is a method now 
 
console.log(list.Count()); // 3

を。

console.log(list.Count); // 3 
console.log(list.Count()); // 3 

私はそれを行うことはできますか?そしてどうやって?ありがとうございました!

+0

おそらくプロキシオブジェクトを使用 –

+0

理由を説明できますか? – robertklep

+0

@robertklep私はC#の背景から来て、私はC#の構文と同じかどうかjsで何かできるか知りたいので。私は答えを見つけた:いいえ。 – Vayne

答えて

1

JavaScriptオブジェクトには、実際には「メソッド」や「プロパティ」などはありません。プロパティに沿ったより多くの "キー"だけがあります。キーの中には、そのデータとして関数を格納するものと、キー参照の結果に()を付けることによってデータを呼び出すことができるものがあります。関数を格納するキーのみがlist.Count()の構文を使用できます。

したがって、同じ識別子を持つ2つのキーは、保持しているデータに関係なく使用できません。

しかし、これは構文を超えており、適切なオブジェクト指向設計に直接関係しています。キーの目的が何であるかを判断することで、プロパティ構文とメソッド構文を区別することができます。キーがオブジェクト "state"を格納する場合、プロパティシンタックスを使用し、キーがオブジェクト "behaviour"を呼び出す場合は、メソッド構文を使用します。 "state"の格納と "behavior"の提供はオブジェクトが最初の場所。

また、実際にはJavaScriptの「クラス」のようなものはありません。キーワードとその構文は、古典的なオブジェクト指向プログラマーが自宅でより多くの気持ちを感じられるようにするためのものですが、フードの下ではクラスは存在しません。オブジェクトとそのプロトタイプオブジェクトのみ。

+0

非常に役に立ちます。どうもありがとう! – Vayne

関連する問題