28860
> **返された関数が実行されると時は定義時の変数であるstoreを返します(getter)**

・どの行が該当しているのでしょうか？

```

    function gettersetter(store) {
            function prop() {
                if (arguments.length) store = arguments[0]
                return store
            }
    
            prop.toJSON = function () {
                if (store && isFunction(store.toJSON)) return store.toJSON()
                return store
            }
    
            return prop
    }
    
```

・[引用元ページ](http://www.tejitak.com/blog/?p=1577)  
・[GitHub](https://github.com/lhorie/mithril.js/blob/next/mithril.js#L1367)

* * *

**prop関数**

```

    if (arguments.length) store = arguments[0]
    
```

・「関数呼び出し時に渡された引数の数」があれば、「引数として渡されたstore」へ、1つめの引数を代入？  
・どういう意味でしょうか？  
・この部分がsetter？

* * *

**prop.toJSON関数**  
・この関数はどこから呼ばれるているのでしょうか？  
・storeがtrueで、store.toJSONが関数だったら、store.toJSON()を返す？  
・それ以外なら、storeを返す？

```

    prop.toJSON = function () {
                if (store && isFunction(store.toJSON)) return store.toJSON()
                return store
            }
    
```

* * *

_**追記**_  
・getterは下記ですか？

```

    function prop() {
        //if (arguments.length) store = arguments[0]
        return store
    }
    
```

・gettersetter関数を定義後「その戻り値である関数」を呼び出すということは、setterだろうがgetterrだろうが、実際はprop関数を呼び出しているだけ、ということでしょうか？  
・prop.toJSON関数が呼び出されるのは、JSON.stringify から呼び出された時だけなので、上記処理とは全く関係ない、ということ？
CC BY-SA 3.0
2016-09-13T03:08:38.623
28850
2016-09-14T01:29:10.437
2020-06-17T08:14:45.997
-1
7886
question
javascript
Mithril.js の gettersetter 関数が理解できないのですが…
> 返された関数が実行されると時は定義時の変数であるstoreを返します(getter)

返された関数とは、gettersetter関数が実行されて内部で定義されたprop関数(`return prop`で返されている)のことです。  
それが実行されるとgettersetter関数の実行された時のstoreを返します。(prop関数の`return store`が実行される)

例：

```

    var propertyX = gettersetter(11);//getter, setterであるpropertyX(関数)を作る
    propertyX();//引数無しで呼び出すと定義時の値１１が返る(getter)
    propertyX(99);//引数有りで呼び出すと定義時の値１１の値が引数で更新される(setter)
    propertyX();//更新された９９が返る
    
```

`if (arguments.length) store = arguments[0]`

の部分がsetterにあたります。  
_「関数呼び出し時に渡された引数の数」があれば、「引数として渡されたstore」へ、1つめの引数を代入？_  
その通りです。

_この関数(toJSON)はどこから呼ばれるているのでしょうか？_  
[toJSON](https://msdn.microsoft.com/ja-
jp/library/cc907896\(v=vs.94\).aspx)に詳しく説明されていますが、  
**JSON.stringify** から呼び出されて文字列化（JSON表現の文字列に変換）されます。  
つまりJSONに変換したい（シリアライズ化したい）関数などから呼ばれます。

_storeがtrueで、store.toJSONが関数だったら、store.toJSON()を返す？_

最初の`store`では「storeがtrue」というよりnullでないことを確認しています。  
(null
はプロパティを持つことはないため引数の実体がnullだった場合`obj.toJSON`とプロパティにアクセスしようとするとエラーになる（普通のオブジェクトの場合単に値がundefinedになるだけでエラーにはならない）そのためにまずnullでないということを確認する必要があります）  
それでtoJSONプロパティが関数として設定されていればそれを呼び出しその結果を返す  
ということです。
CC BY-SA 3.0
2016-09-13T10:33:46.790
28860
2016-09-13T10:56:17.490
2016-09-13T10:56:17.490
5044
5044
28850
answer