回答編集履歴

2

\(代替案\) インスタンスプロパティに値を代入する

2016/10/12 14:34

投稿

think49
think49

スコア18166

test CHANGED
@@ -1,3 +1,7 @@
1
+ ### 外部スコープから内部スコープを参照する
2
+
3
+
4
+
1
5
  スコープ外から変数を書き換えることは不可能なので、予め内部に書き換える仕組みを作ってみてはどうでしょうか。
2
6
 
3
7
 
@@ -12,7 +16,7 @@
12
16
 
13
17
  }
14
18
 
15
-
19
+
16
20
 
17
21
  test.set = function set (_a, _b) {
18
22
 
@@ -22,7 +26,7 @@
22
26
 
23
27
  };
24
28
 
25
-
29
+
26
30
 
27
31
  return test;
28
32
 
@@ -38,4 +42,68 @@
38
42
 
39
43
 
40
44
 
45
+ このコードは深く考えずに書きましたが、筋の良い書き方とは私も思いません。
46
+
47
+ 無名関数内に閉じ込められていたローカル変数 `a`, `b` がグローバルスコープから参照できるようになっているわけですが、
48
+
49
+ これは例えるなら、「**ローカル変数がグローバル変数に化けている**」ようなものだからです。
50
+
51
+
52
+
53
+ ### (代替案) インスタンスプロパティに値を代入する
54
+
55
+
56
+
57
+ 後で書き換える意図があるならオブジェクト指向的に関数を定義するのが良いと思います。
58
+
59
+
60
+
61
+ ```JavaScript
62
+
63
+ function Foo (a, b) {
64
+
65
+ this.a = a;
66
+
67
+ this.b = b;
68
+
69
+ }
70
+
71
+
72
+
73
+ Object.defineProperty(Foo.prototype, 'test', {
74
+
75
+ writable: true,
76
+
77
+ enumerable: false,
78
+
79
+ configurable: true,
80
+
81
+ value: function test () {
82
+
83
+ return this.a + this.b;
84
+
85
+ }
86
+
87
+ });
88
+
89
+
90
+
91
+ var foo = new Foo(2, 3);
92
+
93
+ console.log(foo.test()); // 5
94
+
95
+ foo.a = 4;
96
+
97
+ foo.b = 5;
98
+
99
+ console.log(foo.test()); // 9
100
+
101
+ ```
102
+
103
+
104
+
105
+ getter, setter 的なプロパティを定義すれば更に複雑な動作も実現できます。
106
+
107
+
108
+
41
109
  Re: tkow さん

1

typo修正

2016/10/12 14:33

投稿

think49
think49

スコア18166

test CHANGED
@@ -1,4 +1,4 @@
1
- スコープ外からへんすう書き換えることは不可能なので予め内部に書き換える
1
+ スコープ外から変数を書き換えることは不可能なので予め内部に書き換える仕組みを作ってみてはどうでしょうか。
2
2
 
3
3
 
4
4