2017-01-26 6 views
0

ここに私の最初の質問ですので、何かを見逃してもお詫びします。 おそらく、私の問題の解決策が見つかるかもしれませんが、私はそれを検索する方法がわかりませんし、Googleなどでそれを聞く方法についての手掛かりもありません。JavaScriptのコンストラクタと引数

私は次のような問題を持っている、のは

const Product = function (color) { 
    let self = {}; 

self.setColor = function(colorToSet) { 
    color = colorToSet; 
} 

self.getColor = function() { 
    return color; 
} 

return self; 
}; 

なコンストラクタを持って聞かせて、私が使用しようとしたときに、今:クロームコンソールで

let self = {}, color; 

私は色が既に宣言されているというエラーを受け取ったので、私(上記のスニペットコードで)、私は説明できない魔法が発生しました。

のは、私はこのような何かを書くだろうと言ってみましょう:それは初めての色を返す場合

let a = Product("Yello"); 
a.getColor() ----> "Yellow" 
a.setColor("red"); 
a.getColor() ----> "red"; 

、それは何らかの形で宣言する必要があります。 私は色フィールドがどこにあるのかわかりませんが、実際にはどこでもオブジェクトやプロトタイプで見つけることができません。なぜ私に説明できますか?それはどこですか?

私は色を宣言することができます: self.color = color; しかし、私は上記の例をどのように働かせているのか、そしてカラーフィールドで何が起きたのかを知りたい。私は、このような方法で、パラメータの値を宣言してみましょう使用できるかどう

また、あなたは私に言うことができますか?

const Product = function (color) { 
let self = {}, color; 

self.setColor = function(colorToSet) { 
    color = colorToSet; 
} 

self.getColor = function() { 
    return color; 
} 

return self; 
}; 
+0

Afaik、 'color'だけを使うと' window'オブジェクトに追加されます。実際には 'window.color'を取得/設定しています。 –

+0

@Chris G:色が 'window'で定義されていない、これは** closure **の動作です – Pineda

答えて

0

それは魔法ではありません:)ので、この動作が起こる:あなたは closuresある2つのメソッドを持つオブジェクトを返します

。関数が別の関数内で定義され、その後、どこかに保存それへの参照を(あなたが戻ったとき、この場合には、次にself変数に取り付けられ)、次いでclosureが作成さ

。要するに、関数は、定義ブロック内およびその囲む環境(コンストラクタ定義)内で作成された変数にアクセスできます。

これにより、親が呼び出された時点で、囲みスコープ内のすべての変数にアクセスできます。

これには、その製品関数を囲んでいるパラメータのすべてが含まれます。つまり、定義するcolor引数です。だから、

  • あなたは色で商品受け渡しを呼び出し、変数aでこれを格納します。この時点での特性の二つの方法getColorsetColorを含む

  • 後者の方法は閉鎖されているので、彼らは(彼らの囲み機能環境が呼び出された)時間の積でその囲むスコープへのアクセス権を持っているオブジェクトへの参照を含むことになります。生成物をカラーで呼び出されたため、変数は、製品にローカルcolorと呼ばれるが、はまた、任意のクロージャにが利用可能に作成され、渡された値が割り当てられます。この場合colorの両方のでイエロー

  • 」に等しくなりますメソッドは同時に同じスコープで定義されていましたが、両方ともこの変数にアクセスして、経験した結果が得られました。

0

それは何らかの形で宣言する必要があります。カラーフィールドがどこにあるのか分かりません。オブジェクトやプロトタイプでは見つけられません。実際にはどこにもありません。なぜ私に説明できますか?それはどこですか?

パラメータ名として使用して宣言した変数です。そのパラメータ変数は、Product関数にスコープされており、つまり、その内部の任意の場所で使用できます。 let colorを使用しようとすると、「既に宣言されました」というエラーが表示されます。

あなたのメソッドはclosuresであるため、このローカル変数にアクセス(読み書き)できます。

関連する問題