ルック:
var foo = { prop: 1 };
foo.count = 0;
console.log(foo.count); // 0
foo
は、任意のオブジェクトにすることができます。それは{}
として初期化する必要はありません。私は強調するために、変数に割り当てられた関数式としての機能を書いた
var foo = function (num) {
console.log("foo: " + num);
};
foo.count = 0;
console.log(foo.count);
:それは、配列(例えば[1, 2, 3]
)、日付(例えばnew Date()
)、他のオブジェクトなども機能することができfoo
にオブジェクトが割り当てられていることを示します。しかし、それはまた、関数宣言の構文で動作します:
function foo(num) {
console.log("foo: " + num);
}
foo.count = 0;
console.log(foo.count);
限り、それはnot read-onlyあるとして、あるオブジェクトfoo
の種類をそれを問題ではありません、あなたはfoo.count = 0
ようなものでプロパティを追加したり、上書きすることができます。
実際の例では、foo.count
は関数が呼び出された回数をカウントする必要がありますが、機能しません。this
は関数を参照するのではなく、グローバルオブジェクトブラウザで実行している場合はwindow
)。
はそれを修正するには、関数は次のようになります。
function foo(num) {
console.log("foo: " + num);
foo.count++;
}
...しかし、あなたは関数の名前を「ハードコーディング」する必要があるとして、それは、汎用的ではありません。
別の方法ではなく、(this answerから取られた)数値プロパティのcount
方法で関数を作成するために、クロージャを使用している:
var foo = (function() {
var count = 0;
// Create the actual function
var f = function (num) {
console.log("foo: " + num);
count++;
};
// ... and give it the count method
f.count = function() {
return count;
}
// Return that function (it will be assigned to foo)
return f;
})(); // immediately execute the above code: it returns a function
foo(2); // this increments count from 0 to 1.
console.log(foo.count()); // 1
また、オブジェクトのプロパティを設定するために 'obj.name = 'value''と言うこともできます。オブジェクトが関数の場合はまったく同じです。 – Thilo
@trincot:本は実際には全く同じ点を作っています。コードは 'console.log(foo.count);で終わります。 // 0 - WTF? '、それはOPによって複製されませんでした。 – Amadan
私はその質問が 'foo.count'についてもっとあると思います。 – trincot