1

これはばかげた質問のように思えますが...
コンストラクターがある場合:

function Candy(name) {
    this.name = name;
}

そして、このオブジェクト Candy のプロトタイプを拡張します。

Candy.prototype.printName = function(name) {
    console.log(this.name);
};

次に、Candy コンストラクターから新しいオブジェクトを作成し、この新しいオブジェクトに対して継承されたメソッドを実行します。

var chocolate = new Candy("chocolate");
chocolate.printName();

出力としてチョコレートが得られる理由については、私にはわかりません。
コンストラクターからチョコレートオブジェクトを作成するとき、本質的にこれを行いました:

var chocolate = new Candy();
chocolate.name = name;  

もしそうなら、なぜ実行すると次のようになるのですか:

chocolate.printName();  

空白の引数を指定すると、「chocolate」? と吐き出します。
チョコレートは、単に Candy コンストラクターから構築したオブジェクトの名前ではありませんか?
のように、chocolate は、chocolate.name パラメータに割り当てたものではありませんが、name です。空の引数フィールドを渡したのに、名前が返されずに「チョコレート」が返されるのはなぜですか?

4

3 に答える 3

2

nameメソッド内のパラメーターprintNameは使用されません。指定した署名でメソッドを呼び出すには、次のようにします。

chocolate.printName("Fudge");

"Fudge"これにより、文字列がパラメータとしてメソッドに送信されますnameが、パラメータは無視され、代わりにオブジェクトに指定した名前が出力されます。

Javascript では、任意の数のパラメーターを指定して任意の関数を呼び出すことができます。使用するパラメーターが少なすぎると、残りのパラメーターは value だけになり、undefined使用するパラメーターが多すぎると、それらはargumentsコレクションに含まれますが、パラメーター変数には入れられません。

したがって、 を呼び出すchocolate.printName();と、パラメータnameの値は になりますundefined。を呼び出すとchocolate.printName(1,2,3)、パラメーターnameには値1があり、他の値は関数内でarguments[1]およびとして使用できますarguments[2]

于 2013-02-17T11:24:39.970 に答える
1

正確に何を探しているのかわかりませんが、次のprototype関数を追加すると

Candy.prototype.compare = function (obj) {
  console.log(this === obj);
}

var chocolate = new Candy();

そして、それを呼び出し、

chocolate.compare(chocolate);

true と出力されます。したがって、値を割り当てると

chocolate.name = name; // Asuming name = 'chocolate'

chocolate.printName();nameの値、つまりチョコレートを常に表示します。

于 2013-02-17T11:23:36.977 に答える
0

これを行うため:

var chocolate = new Candy("chocolate"); // "chocolate" is your argument here

そして、Candy コンストラクター内で、引数が取得されて割り当てられthis.nameます ...

function Candy(name) {
   this.name = name; // name is "chocolate" if we use the above
}

次に、コンストラクターに渡される引数として定義した Candy オブジェクト内からprintnameログを記録しているだけなので、メソッドは "chocolate" を返します。this.nameCandy()

それが理にかなっていることを願っています。

于 2013-02-17T11:21:01.850 に答える