2016-01-15 9 views
7
class Employee { 

    constructor(name, age) { 
     this._name = name; 
     this.age = age; 
    } 

    doWork() { 
     return `${this._name} is working`; 
    } 

    get name() { 
     return this._name.toUpperCase(); 
    } 

    set name(newName){ 
     if(newName){ 
      this._name = newName; 
     } 
    } 
} 

let man = new Employee('A', 10); 
console.log(man.name, man.age); 
man.name = 'B'; 
man.age = 20; 
console.log(man.name, man.age); 

ここに私のコードです。私は_nameメンバーのためにgettersetterを作成しました。 ageの場合はgettersetterを作成しませんでした。JavaScriptで `getter`と` setter`が必要ですか?

しかし、両方がこの

のように、これらの二つのフィールドを更新することができますので、私は混乱しています、getterおよびJavaScriptで必要setterですか?

+0

はい、時々必要です。あなたのコードでそれらを必要としない場合は、それらを使用しないでください。 – Oriol

答えて

8

はい、ゲッターやセッターは時々非常に便利ですが、その特定の機能が必要なとき、彼らにのみ使用する必要がある - それ以外の場合はゲッターやセッターのないプレーンなプロパティへのアクセスはうまくすることができます。

ゲッターはあなたには、いくつかのコードにプロパティが要求されるたびに実行したい場合に使用があります。あなたの例では、ゲッターは、名前の大文字小文字に関係なく、大文字の名前を返します。

セッターを使用すると、いくつかのコードにプロパティが設定されるたびに実行したい場合に使用があります。あなたの場合、それは偽の名前の設定を防ぎます。ゲッター/セッターなしでこれらの機能のいずれかを実装することはできません。

直接プロパティアクセスは、ゲッターやセッターの特別なロジックを必要としない場合には、完全に適切な方法です。

-1

私たちがクラスを使用する理由は、単一のエンティティのすべてのプロパティを保持する理由です。しかし、オブジェクトを作成するだけで達成でき、必要に応じてプロパティを追加することができます。

コードが大きくなると、コードがどこで失敗するかをデバッグできなくなります。構造に従うと、簡単にdubugできます。すべてのエンティティが別々のファイルになり、ロジックが分離されるためです。

しかし、JavaScriptはオブジェクト指向のプログラミング言語です。オブジェクトの代わりにクラスを使用する理由は、ゲッターとセッターで同じです。必要のない場所で使用できる場所に似ていません。 setterとgetterですべてのプロパティを設定して取得します。

年齢が100歳を超えるなど、プロパティを設定するときに条件を追加することがあります。プロパティに設定しないでください。その時点で、基本クラスを変更する必要がありますまた、あなたの子供のクラスで。それは私たちの人生(コードリファクタリング)の中で最も難しい部分です。私の視点から、これらの種類の問題を避け、変数を安全にするために、getterとsettersを使用するべきです。あなただけの読み取り専用にするために、次のようにgetterメソッドを使用して、その真の性質を作りたい場合はgettersetter方法を使用して

0

にお答えすることは、クラスで自分の特性に依存:

function Person(name, age){ 
 
    var _name = name; 
 
    this.age = age; 
 
    
 
    this.getName = function(){ 
 
    return _name; 
 
    } 
 
} 
 

 
var teacher = new Person('Sara', 24); 
 

 
//now you can just get the name of teacher 
 
alert(teacher.getName()); 
 

0

必要? No.

ゲッター/セッターとして最もよく表現されるシナリオはありますか?はい。

//declare an object 
rectangle = { 
    x: 10, 
    y: 20, 
    get area() { return this.x * this.y } //won't occupy storage 
} 

//usage 
log('the area is', rectangle.area)  //=> 'the area is 200'. 
              // cleaner syntax (no parentheses) 

APIデザイナーのニーズを考慮してください。ほとんどの場合、ユーザーがAPIをどのように認識しているかを過敏に感じる可能性があります。すべてのビット(この場合はカッコ)は、インターフェイスをクリーンアップするためにカウントされます。

関連する問題