Object.defineProperty()を使用してデータプロパティをアクセサプロパティに変換したいと考えています。私は、なぜエラー作物を理解Uncaught RangeError: Maximum call stack size exceeded
エラーObject.definePropertyでのgetterとsetterの使用
var c = { name: 'abcde'};
Object.defineProperty(c, 'name', {
get: function() {
return this.name; //causes stack overflow
},
set: function(x) {
this.name = x; //causes stack overflow
}
});
c.name="xyz";
console.log(c.name);
につながり、このためのコードを考えてみましょう。提案された解決策の 一つはゲッターとセッターから「この」を削除することであり、動作しているようです。
var c = { name: 'abcde'};
Object.defineProperty(c, 'name', {
get: function() {
return name; //removed this
},
set: function(x) {
name = x; //removed this
}
});
c.name="xyz";
console.log(c.name);
何が起こっているか一般的に、Object.defineProperty()を使用してデータプロパティをアクセサープロパティに変換する方法を尋ねたいと思いますか?それは代わりにオブジェクトc
に格納する値を格納するname
と呼ばグローバル変数を使用するため
素晴らしいソリューション。しかし、ここで 'name'のようなデータプロパティをここでアクセサプロパティに変換する方法はありますか?ここでは名前を閉鎖しています。私は最初にデータプロパティとしてそれをしたい。 –
@BreakingBenjamin AFAIK、唯一の他の方法は、実際のプロパティをシャドーしてから、実際のプロパティを「プライベート」とマークするための命名規則(例:先頭のアンダースコア)を使用することです。実際の値を格納するのに '._name'を使うことができますが、' .name'を使ってアクセスします。 – Alnitak