3

私はstackoverflowを通じてこれにつまずきました.

私は大学で C++ を勉強しましたが、ポインタはちょっと覚えています

http://www.permadi.com/tutorial/jsFunc/index2.html

私の問題はコードで始まり、特定のことが機能していません

function theAdd(a, b){    
  return a*b;
} 

//creating a copy of the function
var add3 = new theAdd(); 

add3.name = 'nameProperty';
//alert( add3(1,2))   //why doesn't this work?  
alert(theAdd(5,5)  + " " +  theAdd.name);        


function Ball()    {
    return 'balltext';
}
var ball0=new Ball(); // ball0 now points to a new object

alert(  Ball()  );         // this works
alert(  ball0() );         // why doesn't this work? shouldn't it return balltext?
4

4 に答える 4

3
//creating a copy of the function
var add3 = new theAdd(); 

これは関数のコピーを作成しません。関数をコンストラクター関数として呼び出します。add3その関数によって作成されたオブジェクトになります。

alert( add3(1,2)) なぜこれが機能しないのですか?

は関数ではないためadd3です (通常のオブジェクトです)。

alert( Ball() );これは動作します

関数を「通常の」方法で呼び出しています。呼び出しの結果は、関数が返す値になります。

alert( ball0() );なぜこれが機能しないのですか?

ball0関数ではありません。

ボールテキストを返すべきではありませんか?

いいえ。newキーワードは特別な方法で関数を呼び出します。MDN ドキュメントから:

コード new foo(...) が実行されると、次のことが起こります。

  1. から継承して、新しいオブジェクトが作成されfoo.prototypeます。
  2. コンストラクター関数fooは指定された引数で呼び出され、これが新しく作成されたオブジェクトにバインドされます。new fooと同等ですnew foo()。つまり、引数リストが指定されていない場合、foo は引数なしで呼び出されます。
  3. コンストラクター関数によって返されるオブジェクトは、新しい式全体の結果になります。コンストラクター関数が明示的にオブジェクトを返さない場合は、代わりに手順 1 で作成されたオブジェクトが使用されます。(通常、コンストラクターは値を返しませんが、通常のオブジェクト作成プロセスをオーバーライドする場合は、値を返すことを選択できます。)

オブジェクトではなくプリミティブ値 (この場合は文字列) を返すため、最初のステップで作成されたオブジェクトが返され、 に割り当てられball0ます。

newthenで関数を呼び出す場合、その関数をコンストラクター functionとして使用しています。つまり、新しいオブジェクトを作成することになっています。演算子はnew、関数自体が何を返すかに関係なく、オブジェクトが常に返されることを保証します。

以下もご覧ください。

于 2013-09-09T19:53:38.497 に答える
3

ball0はオブジェクトであり、関数のように使用できないため

これをチェックして、新しい仕組みを確認してください

于 2013-09-09T19:51:41.280 に答える
1

そこにはかなりの数の質問がありますが、その多くは JavaScript のオブジェクトの概念とコンストラクター関数に関連しています。演算子を使用するnewと、「空の」オブジェクトが作成され、パラメーターとして渡されたオブジェクトを使用して関数が呼び出されthisます。どの関数もコンストラクターとして使用でき、混乱を引き起こしていると思います。

いくつかの質問に答えます:

add3(1,2)なぜ数字を追加しないのですか?

これはadd3、関数ではなくオブジェクトであるため、new 演算子を使用したためです (この場合、コンストラクターは で何もせずthis、その戻り値は構築時に無視されました)。

アラート(ボール());

これは単なる関数呼び出しです。ご想像のとおり、に渡される文字列を返します。alert()

アラート( ball0() );

これは、ball0 がコンストラクタとして Ball を使用するオブジェクトであるため、期待どおりには動作しません。

W3Schoolsにある JavaScript オブジェクトの非常に優れた入門書です。

于 2013-09-09T19:58:18.633 に答える