答えて
プロパティにプリミティブ型(文字列、数値、ブール値)または不変オブジェクトへの参照(String
,Number
)がある場合、呼び出し元が行うことはできないため、値/参照を直接返すことですそれによってオブジェクトの状態が変更されます。
プロパティが変更可能なオブジェクト(配列、Object
、Date
、他のもののとてもたくさん)への参照型を持つ場合、それはあなたが呼び出し側は上のプロパティを変更できるようにしたいかによって異なりあなたのオブジェクトのコピー。そうした場合は、参照を返します。そうでない場合は、クローンしてください。例えば
は、のプライベート配列し、その配列に対して実行できるいくつかの操作でオブジェクトを想定してみましょう:
var obj = (function() {
var o = {};
var theArray = [];
o.addItem = function(item) {
theArray.push(item);
};
o.getItemAt = function(index) {
return theArray[index];
};
return o;
})();
(これは、オブジェクト設計の栄光の一例であることを意味するものではないことに注意してください。: - ))
これで、getArray
操作を追加します。あなたは配列への参照を返すことができ
::次の2つの方法でそれを行うことができます(のようにそれから項目を削除するには、物事のすべての種類を行うことができ、発信者を意味
o.getArray = function() {
return theArray;
};
を...、オブジェクトが以前サポートしていなかった操作)は、オブジェクトの状態を変更します(以前のプライベート配列に直接アクセスできるようにしているため)。
それとも、配列のクローンを返すことができます。
o.getArray = function() {
return theArray.slice(0);
};
...プライベート配列に何もできない発信者を意味し、彼らはそれだけのコピー上で動作することができますそれらを与えた。
これは、プライベートプロパティが不変かどうかによって異なります。それが不変の場合、変更することはできず、それを返すことに害はありません。しかし、それが変更可能ならば、それを返すことは情報隠蔽のOOP原則を破るでしょう。
それは原始的な不変のint型/数だ場合、それは二つのことを達成しているので、その後、私有財産を返すことは結構です:
- あなたは私有財産を隠し、インタフェース、およびの実装に変更を提供それはプリミティブ型だと
しかし、もし値によって渡されるため、私有財産は、あなたのように簡単に
これらの理由から、変更可能なオブジェクトにコピーを返す予定の場合は、そのコピーを作成し、元のオブジェクト自体は返しません。
一般に、プロパティを使用する場所は、プロパティ値を変更できないはずです。これはOOPの重要な原則、すなわちカプセル化を満たす。
- 1. データスキーマスタイル、オブジェクトの名前がキーまたはプロパティである場合
- 2. javascriptオブジェクトのプロパティJavaScriptでオブジェクトのプロパティを参照なぜこのdoesntの仕事で渡された場合は
- 3. _differenceオブジェクト参照のチェックまたはプロパティによるプロパティのチェック
- 4. PowerShell Groupオブジェクト複数のプロパティが等しい場合は?
- 5. ジャクソン:プロパティがnullの場合、別のプロパティへのデシリアライズ
- 6. プロパティ名がJSPの変数自体である場合、オブジェクトのプロパティの値を取得する方法は?
- 7. オブジェクトのプロパティ値の更新は、別のオブジェクトのプロパティ値への参照のように振る舞います。
- 8. 値が負の場合は0にするbyteプロパティ?
- 9. プロパティがインターフェイスタイプの場合、AutoMapperはnullプロパティをマップしようとしますか?
- 10. 2つのオブジェクトを結合しますが、最初のオブジェクトに既にプロパティがある場合は、2番目のオブジェクトのプロパティは無視されます
- 11. プロパティへの参照がある場合、包含オブジェクトへの参照を取得する方法はありますか?次のように
- 12. プロパティを直接使用するのではなく、JavaFXプロパティsetterとgetterを使用する場合は、
- 13. コントロールにプロパティがある場合、コントロールのプロパティ値を変更します。
- 14. この場合の値または参照のセマンティクス?
- 15. ビューがプロパティの場合、InitWithFrameは実行されません。
- 16. 関連オブジェクトのプロパティが変更された場合のコアデータオブジェクトの更新
- 17. プロパティの数がnより大きい場合は、Neo4j
- 18. は、あなたがゲッターと読み書きプロパティのセッター、または読み取り専用プロパティのゲッターの両方を実装する場合はObjective Cの内のプロパティのセッター
- 19. x:Nameプロパティのコードへのアクセス - FrameworkElement以外のオブジェクトの場合
- 20. オブジェクトのプロパティは、最初は、undefinedを返しますが、値
- 21. プロパティを関数に渡した後、.NETでプロパティの属性を取得する場合は、
- 22. セッターとゲッターの完全プライベートプロパティ
- 23. 角2オブジェクトのプロパティが変更された場合は、@入力値を更新します
- 24. タイプがWinRTのImageSourceの場合、UserControlプロパティへのバインドエラーです。
- 25. Mongooseはオブジェクトを作成する必要がありますが、別のオブジェクトにすでにこのプロパティがある場合はプロパティをスキップします。
- 26. TypeError:プロパティ 'apply'が未定義の場合
- 27. JavaScriptオブジェクトのプロパティが空の文字列の場合
- 28. バッキングフィールドがある場合とない場合の自動プロパティ - プリファレンス?
- 29. nullの場合はプロパティファイルにプロパティを追加します。
- 30. 値でJavascriptオブジェクトのプロパティを返すNOT参照