このコードが私にエラーをもたらす理由はわかりません。私がしたいのは、配列をプロパティとして持つオブジェクトを作成することだけです。私はsetterとgetterでこれを実現したいが、何らかの理由で何らかの理由でthis.array = []
内にsetArray関数がある最大呼び出しスタックサイズがを超えている。私は間違って何をしていますか? Javascriptのアクセサプロパティについては何が分かりませんか。Javascriptアクセサのプロパティの混乱
答えて
あなたはそれが永遠に再帰的理由であるセッター、内からセッターとプロパティに代入している:、あなたが他の場所で値を格納する必要が
var obj = {
set array(size) { // <== The property is called `array`
this.array = []; // <== This calls the setter
for (var i = 0; i < size; i++){
this.array[i] = i; // <== This would fail because there's no getter
}
}
};
ここで例えば、我々が作成プライベートスコープと変数の上に近い:
var obj = (function() {
var array = [];
return {
set array(size) {
array = []; // No `this` here
for (var i = 0; i < size; i++) {
array[i] = i; // No `this` here
}
},
showArray() {
console.log(array);
}
};
})();
var myObj = Object.create(obj);
myObj.array = 20;
myObj.showArray();
あなたは機能の回避について尋ねました。プロパティの値を本当にプライベートにする関数が必要です。しかし、あなたが何らかの理由でそれを使用したくない場合、それが本当にプライベートであることに悩まされていない場合は、ZoltánTamásiが行ったことを行うことができますhis answer:同じオブジェクトに対して別のプロパティを使用します。彼の答えは基本的なプロパティ(例えば_array
)に_
という接頭語を使用しています。非常にというJavaScriptの共通規約では、プライベートプロパティはなくても「このままにしてください。事実、本当にプライベートプロパティを持つ言語(たとえば、インスタンスフィールドと呼ばれるJavaのようなもの)であっても、通常、それを回避するために使用できる強力なリフレクションメカニズムのいくつかの形式があります...
これを行うには、シリアライズする場合にJSONにそのプライベートプロパティを含めるかどうかを検討する必要があります。ない場合は、ちょうどあなたがコントロールすることができるようにどのプロパティがシリアル化中に含まれているだけでなくtoJSON
を実装:
var obj = {
_array: [],
foo: "a value to include in JSON",
set array(size) {
this._array = []; // Note the _
for (var i = 0; i < size; i++) {
this._array[i] = i;
}
},
showArray() {
console.log(this._array);
},
toJSON() {
return {
// Here we list only the properties we want to have
// included in the JSON
foo: this.foo
};
}
};
var myObj = Object.create(obj);
myObj.array = 20;
myObj.showArray();
console.log(JSON.stringify(myObj));
これは関数の呼び出しなしで可能ですか?だから、関数の結果と同じに設定せずにオブジェクトを作成できますか? –
基本的な配列を適切に隠すため、つまりプライベートメンバーの可視性をシミュレートするには、関数クロージャが必要です。 –
@ YasinYaqoobi:なぜそれをやっているのが問題なのですか?上記の真のプライベート変数を使用するには、関数が必要です。しかし、Zoltánのようにオブジェクトを別のプロパティとして配列を格納することもできます。その問題はどこのコードからでもアクセスできることです。どのくらいの問題があなた次第であるのか、多くの人がそれを心配することはありません。「_で始まり、それだけで大事にしてください。それを行うと、他のプロパティを列挙できないようにしたいので、JSONなどには表示されません。 –
this.array = []
を書き込むときにセッター自体をセッター内部で使用しています。例えば_array
と呼ばれる別のメンバーを紹介し、それをarray
プロパティの設定者に記入してください。
var obj = {
_array: [],
set array(size) {
for (var i = 0; i < size; i++){
this._array[i] = i;
}
}
};
var myObj = Object.create(obj);
myObj.array = 20;
別のプロパティを使うと、ユーザが 'obj._array'にアクセスすることができるので、セッターを使う価値がいくらか無効になります。 @ T.J.Crowderのクロージャメソッドは、必要な場合に情報隠蔽を実装します。 – Barmar
あなたは正しいです、私はちょうどコードのセマンティクスを扱わずに技術的な問題を指摘しました。ところで、私は今TypeScriptを何年も使用しています。そこには 'private'キーワードがあります(私のコーディング規則はプライベートメンバーの名前をアンダースコアで始めることです)。 –
あなたがセッターとゲッターを使用したいと述べていたが、このスニペットはちょうどOBJを使用しています。オブジェクトの配列を表示するにはshowArrayの代わりに配列を使用します。
var obj = (function() {
var _array = [];
return {
get array(){
return _array;
},
set array(size) {
_array = [];
for (var i = 0; i < size; i++) {
_array[i] = i;
}
}
};
})();
obj = Object.create(obj);
obj.array = 20;
console.log(obj.array);
- 1. Javascriptの混乱
- 2. JavaScriptブロックステートメントの混乱
- 3. JavaScriptパラメータの混乱
- 4. Foregroundプロパティ行動の混乱
- 5. のNode.js、PHP、Javascriptの混乱
- 6. JavaScriptのデータ型の混乱
- 7. JavaScriptのスコープの混乱
- 8. JavaScriptスコープとの混乱
- 9. Javascriptオブジェクト処理の混乱
- 10. JavaScript forEach()メソッドの混乱
- 11. Javascript配列ロギングの混乱
- 12. Javascript継承との混乱
- 13. jQuery/JavaScript "this"ポインタの混乱
- 14. JavaScript関数の混乱?
- 15. Javascriptオブジェクトとの混乱
- 16. Javascriptオブジェクトのキー値混乱
- 17. MDN constructorプロパティの説明の混乱
- 18. C#のプロパティに関する混乱
- 19. Xcodeの混乱 - プロパティと合成、保持?
- 20. EaselJS shape x、yプロパティの混乱
- 21. 混乱したJavascript投稿
- 22. C++ - 演算子の混乱の混乱
- 23. 'this'クロージャー機能内のJavaScriptの混乱
- 24. JavascriptのsetTimeout関数の混乱
- 25. Javascriptのビット演算子の混乱
- 26. 2つの混乱するJavascriptのクイズ
- 27. Javascriptの継承/プロトタイプの混乱
- 28. 事業部の混乱混乱
- 29. HTML5ビデオとjavascript - 構文の混乱
- 30. JavaScriptのコンテキストに関する混乱
*「...私はセッターとゲッターでこれを達成したい...」*あなたはゲッターが返すようにしたいですか?私は意図的に私の答えに1つを含めることから遠ざかっていました。なぜなら、配列を返すと、セットされたときには数字ですが、配列になると本当に奇妙なプロパティになります。それは普通理想的ではありません:-) –