質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

577閲覧

ES2022 クラスインスタンスのプライベートのフィールドについて

taka_oct092018

総合スコア133

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

2クリップ

投稿2022/12/14 19:42

編集2022/12/14 19:47

functionとprototypeで記述された関数をclassを使って書き換えてみました。
ES2015の書き方では問題なく作動しましたが、 ES2022のプライベートのフィールドを
設定した所、作動してくれなくなりました。エラーメッセージはありません。
どうしてなのか原因が分かりません。教えて頂けないでしょうか。よろしくお願い致します。

「改訂新版jQuery本格入門 P290リスト6-51」より。コードは私が編集を加えました。

jQuery

1 const Counter = function(initial, step) { 2 this.count = !Number.isNaN(initial) && Number(initial) || 0; // 初期値 3 this.step = !Number.isNaN(step) && Number(step) || 1; // 増分 4 }; 5 6 Counter.prototype = { // thisはCounterインスタンスを表す 7 inc() { this.count += this.step; } 8 }; 9 10 const LimitCounter = function(counter, limit) { 11 this.counter = counter; 12 this.count = this.counter.count; 13 this.deferred = $.Deferred(); // resolve実行のためのDeferredオブジェクト 14 this.limit = limit; 15 // このオブジェクトにPromiseの機能を追加。($.whenや.promise()を記述しなくて済む) 16 this.deferred.promise(this); 17 }; 18 19 LimitCounter.prototype = { 20 inc() { 21 if (!this.deferred.state() !== 'resolved') { 22 this.counter.inc(); 23 this.count = this.counter.count; 24 25 if (this.counter.step > 0 && this.counter.count >= this.limit || 26 this.counter.step < 0 && this.counter.count <= this.limit) { 27 28 // 限度に達したらresolveを実行 29 this.deferred.resolve(this.limit, this.count); 30 } 31 } 32 } 33 }; 34 35 const counter = new LimitCounter(new Counter(1, 2), 4); 36 37 // カウンタの値が限度に達したらdoneで登録された処理を実行 38 counter.done(function(limit, count) { 39 alert(`カウンタの値が${ limit }に達しました(${ count })`); 40 }); 41 42 // カウンタの値を表示する処理(thisと引数は$.proxyにて設定) 43 const adapter = function(tag) { $(tag).text(this.count); }; 44 45 // ボタンのクリックでカウンタを増やせるようにする 46 $(':button').bind({ // inc, setはカスタムイベント 47 inc : $.proxy(counter, 'inc'), // カウンタを増やす 48 set : $.proxy(adapter, counter, $('#count')), // カウンタの値を表示 49 click() { // カスタムイベントの発火(thisはクリックされた要素) 50 $(this) 51 .trigger('inc') 52 .trigger('set'); 53 } 54 }); 55 56 // カウンタの初期値を表示 57 adapter.call(counter, $('#count'));

jQuery

1 class Counter { // ES2015 作動する。他の部分は変更していない。 2 constructor(initial, step) { 3 this.count = !Number.isNaN(initial) && Number(initial) || 0; // 初期値 4 this.step = !Number.isNaN(step) && Number(step) || 1; // 増分 5 } 6 7 inc() { this.count += this.step; } // thisはCounterインスタンスを表す 8 }

jQuery

1class Counter { // ES2022 作動せず。 2 #count; 3 #step; 4 5 constructor(initial, step) { 6 this.#count = !Number.isNaN(initial) && Number(initial) || 0; // 初期値 7 this.#step = !Number.isNaN(step) && Number(step) || 1; // 増分 8 } 9 10 inc() { this.#count += this.#step; } // thisはCounterインスタンスを表す 11}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/12/14 21:59

> ES2022 作動せず 他の部分のコードはどのようになっているのでしょうか?
taka_oct092018

2022/12/14 23:08

maisumakun様、返信ありがとうございます。 最初のコードの10行目以降は全く同じです。
yambejp

2022/12/15 00:40

jQuery関係なくないですか? 問題点をしぼって質問したほうが回答が付きやすいと思います
guest

回答2

0

ベストアンサー

ハッシュ接頭辞へのアクセスはセッタ/ゲッタを利用しすればよいでしょう

javascript

1class Counter { 2 #count; 3 #step; 4 constructor(initial, step) { 5 this.count = Number(initial)||0; 6 this.step = Number(step)||1; 7 } 8 inc() { this.count += this.step; } 9 get count(){ 10 return this.#count; 11 } 12 set count(num){ 13 this.#count=num; 14 } 15 get step(){ 16 return this.#step; 17 } 18 set step(num){ 19 this.#step=num; 20 } 21} 22const c=new Counter(5,3); 23console.log(c.count); // 5 24c.inc(); 25console.log(c.count); // 8

投稿2022/12/15 00:57

yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2022/12/15 03:52

> ハッシュ接頭辞へのアクセスはセッタ/ゲッタを利用しすればよいでしょう その実装の場合、ハッシュ接頭辞(プライベートプロパティ)にする必要がなくなるのではないでしょうか。
yambejp

2022/12/15 04:21 編集

> ハッシュ接頭辞(プライベートプロパティ)にする必要がなくなる 普通にカプセル化の手法だと思いますが、セッタ/ゲッタの構成でアクセスを絞ることができるメリットがあると思います。もともとプライベート宣言がなく、アンダーバー接頭辞を無理やり使って実現していたわけですし https://teratail.com/questions/18728
taka_oct092018

2022/12/15 05:18

yambejp様、いつもアドバイスをありがとうございます。 具体的に挙げて頂いたコードは教科書の例題のように分かりやすいです。 普段はセッターとゲッターは使ってないので勉強になりました。
guest

0

最初のコードの10行目以降は全く同じです。

count#countは別のプロパティです。そして、#countにクラス外からアクセスする方法はありません。

投稿2022/12/14 23:20

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taka_oct092018

2022/12/15 05:18

maisumakun様、いつもアドバイスをありがとうございます。 その2つを完全に同一視しておりました。 また基礎の部分を復習します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問