teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

7

a

2018/05/18 11:10

投稿

HayatoKamono
HayatoKamono

スコア2415

answer CHANGED
@@ -124,4 +124,24 @@
124
124
  console.log(obj.element) // 2回目以降はキャッシュが使われる
125
125
  obj.element = 'hoge';
126
126
  console.log(obj.element) // 書き換わってしまう
127
+ ```
128
+
129
+ これだと上書き出来てしまうので、上書き出来ない版も追加。
130
+
131
+ ```
132
+ var obj = {
133
+ get element() {
134
+ console.log('1度だけ呼ばれる')
135
+ delete this.element;
136
+
137
+ Object.defineProperty(this, "element", { value: 'キャッシュ対象', writable: false, configurable: true})
138
+
139
+ return this.element;
140
+ }
141
+ }
142
+
143
+ console.log(obj.element) // 初回アクセス
144
+ console.log(obj.element) // 2回目以降はキャッシュが使われる
145
+ obj.element = 'hoge';
146
+ console.log(obj.element) // 書き換わらない
127
147
  ```

6

a

2018/05/18 11:10

投稿

HayatoKamono
HayatoKamono

スコア2415

answer CHANGED
@@ -106,4 +106,22 @@
106
106
 
107
107
  後からクラス名が追加される場合でも大丈夫。
108
108
 
109
- → [https://codepen.io/anon/pen/pVQOXd](https://codepen.io/anon/pen/pVQOXd)
109
+ → [https://codepen.io/anon/pen/pVQOXd](https://codepen.io/anon/pen/pVQOXd)
110
+
111
+ # 追記2
112
+
113
+
114
+ ```
115
+ var obj = {
116
+ get element() {
117
+ console.log('1度だけ呼ばれる')
118
+ delete this.element;
119
+ return this.element = 'キャッシュ対象';
120
+ }
121
+ }
122
+
123
+ console.log(obj.element) // 初回アクセス
124
+ console.log(obj.element) // 2回目以降はキャッシュが使われる
125
+ obj.element = 'hoge';
126
+ console.log(obj.element) // 書き換わってしまう
127
+ ```

5

https://codepen.io/anon/pen/pVQOXd

2018/05/18 11:08

投稿

HayatoKamono
HayatoKamono

スコア2415

answer CHANGED
@@ -104,4 +104,6 @@
104
104
  selectors.$items.first().text('hello')
105
105
  ```
106
106
 
107
- 後からクラス名が追加される場合でも大丈夫。
107
+ 後からクラス名が追加される場合でも大丈夫。
108
+
109
+ → [https://codepen.io/anon/pen/pVQOXd](https://codepen.io/anon/pen/pVQOXd)

4

a

2018/05/18 04:43

投稿

HayatoKamono
HayatoKamono

スコア2415

answer CHANGED
@@ -66,4 +66,42 @@
66
66
  };
67
67
  ```
68
68
 
69
- [https://github.com/mmikowski/spa/blob/master/listings/ch05_06/5.2/js/spa.chat.js#L94](https://github.com/mmikowski/spa/blob/master/listings/ch05_06/5.2/js/spa.chat.js#L94)
69
+ [https://github.com/mmikowski/spa/blob/master/listings/ch05_06/5.2/js/spa.chat.js#L94](https://github.com/mmikowski/spa/blob/master/listings/ch05_06/5.2/js/spa.chat.js#L94)
70
+
71
+ # 追記(変更された質問内容に合わせた回答)
72
+
73
+ コメント欄で`Lhankor_Mhy`さんが書いておられた`lazy getters`をベースに書いてみました。
74
+ [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/get#Smart_self-overwriting_lazy_getters](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/get#Smart_self-overwriting_lazy_getters)
75
+ ```
76
+ var obj = {
77
+ get element() {
78
+ console.log('1度だけ呼ばれる')
79
+ delete this.element;
80
+ return this.element = 'キャッシュ対象';
81
+ }
82
+ }
83
+
84
+ console.log(obj.element) // 初回アクセス
85
+ console.log(obj.element) // 2回目以降はキャッシュが使われる
86
+ ```
87
+
88
+ まずは、簡単なコードで動作確認。
89
+
90
+ ```
91
+ var selectors = {
92
+ $slider: $('#slider'),
93
+ get $items() {
94
+ delete this.$items;
95
+ this.$items = this.$slider.find('.item');
96
+ return this.$items;
97
+ }
98
+ }
99
+
100
+ selectors.$slider.children().each(function(){
101
+ $(this).addClass('item');
102
+ });
103
+
104
+ selectors.$items.first().text('hello')
105
+ ```
106
+
107
+ 後からクラス名が追加される場合でも大丈夫。

3

a

2018/05/18 04:32

投稿

HayatoKamono
HayatoKamono

スコア2415

answer CHANGED
@@ -1,3 +1,9 @@
1
+ # 注釈
2
+ **質問内容が編集され当初の質問と前提が変わっているため、
3
+ 以下、現在の質問内容に対する回答としては成立していません。**
4
+
5
+ # 編集前の質問内容に対する回答
6
+
1
7
  > クラス名を毎回書くのがなんかしっくり来てないです。
2
8
  いざ、定数のように扱おうと思うと、
3
9
 

2

a

2018/05/18 04:04

投稿

HayatoKamono
HayatoKamono

スコア2415

answer CHANGED
@@ -45,7 +45,7 @@
45
45
 
46
46
  ということでまとめると、クラス名を定数化するというよりは、jQueryのセレクターを変数に入れて使いまわすということになります。
47
47
 
48
- その上で、例えば、少し古い本ですが「[シングルページWebアプリケーション ―Node.js、MongoDBを活用したJavaScript SPA](https://www.amazon.co.jp/dp/4873116732)」のコードを参考にみてみると、以下のようにjQueryセクレターを管理しています。
48
+ その上で、例えば、少し古い本ですが「[シングルページWebアプリケーション ―Node.js、MongoDBを活用したJavaScript SPA](https://www.amazon.co.jp/dp/4873116732)」のコードをみてみると、以下のようにjQueryセクレターを管理していますので参考にしてみるのも良いかもしれません
49
49
 
50
50
  ```
51
51
  jqueryMap = {

1

a

2018/05/17 14:54

投稿

HayatoKamono
HayatoKamono

スコア2415

answer CHANGED
@@ -41,7 +41,7 @@
41
41
  2. それを使いまわしてテキストを変更する
42
42
  3. それを使いまわして表示する
43
43
 
44
- というかたちになり、パフォーマンスの
44
+ というかたちになり、パフォーマンスの向上に繋がります。
45
45
 
46
46
  ということでまとめると、クラス名を定数化するというよりは、jQueryのセレクターを変数に入れて使いまわすということになります。
47
47