検索

ホームページ  >  に質問  >  本文

javascript - このプログラムがどのように動作するかを理解できる人はいますか?

リーリー

最後の 3 つの値は何ですか? ? ?

滿天的星座滿天的星座2842日前562

全員に返信(2)返信します

  • 某草草

    某草草2017-05-19 10:43:16

    混乱の理由は 3 つあります:
    まず、定義した name 属性です。関数自体には name とも呼ばれるそのような属性があり、この問題の理解を混乱させます。
    次に、プロトタイプはよく理解されていません。関数のプロトタイプで定義されたプロパティについては、インスタンス化後のオブジェクト (つまり、新しい操作) のみが、「variable.property」メソッドを使用してその値を取得できます。
    第三に、これはよく理解されていません。これはメソッドを呼び出すオブジェクトを指します

    質問に答える前に、例を見てみましょう

    リーリー

    問題を 1 つずつ分析してみましょう (確認するには Chrome ブラウザの開発者ツールを使用してください)

    1. B.callname() は何を出力しますか?

      リーリー

      B は関数であり、その name="B"、B.callname メソッドが呼び出され、呼び出し元が B である場合、callname メソッド内のこれは B を参照します。B.name が何であるかを覚えていますか? 上の最初の例を見て理解してください。

      リーリー

      なぜ「this is B」が B.prototype.name で定義されていないのかと疑問に思うでしょう。 B のプロトタイプで定義されたプロパティには、B のインスタンスからのみ直接アクセスできるためです。
      それでも信じられない場合は、xname などの名前をすべて変更してください。そうすれば、この質問に対する答えは未定義になります

    2. a.callname() 何を出力しますか?

      リーリー

      a 自体は JSON で定義されたオブジェクト インスタンスです。 上記のコードは

      と同等です リーリー

      callname の呼び出し元は a なので、callname 内のこれは a です

      リーリー
    3. (new B()).callname() 何を出力しますか?

      リーリー

      まず、最初に new B() が実行され、関数 B で一時的に b という名前を付けます。つまり、b = new B() となります。このときのをbとすると、B関数本体のメソッドalertが順次実行されます。 b.nameとは何ですか? b はインスタンスであり、name 属性を持たないため、親クラスのプロトタイプ定義で name を検索し、「this is B」を見つけます。new B()先执行, 创建了一个匿名实例,我们暂且给他命名为b, 即 b = new B(), 函数B中的this此时被指代为 b, 然后才是依次执行B函数体内的方法alert, b.name是什么?b是个实例,它本身没有name属性, 就会去父类的prototype定义中找name,找到了 "this is B".
      然后, b.callname() 次に、b.callname() が実行され、callname が定義されます。これはメソッド呼び出し元 b を参照します。インスタンス b 自体には name 属性がありません。親クラスでプロトタイプの name 属性値を見つけて返します。

      リーリー

    返事
    0
  • 迷茫

    迷茫2017-05-19 10:43:16

    最初のものでは、this is a がポップアップします。2 つ目のものでは、B は関数 B を表し、3 つ目のものでは、this is B が最初にポップアップします。インスタンス化するときに関数が実行されるためです。この場合、前のステートメント (new B()) にセミコロンがないため、構文エラーが発生します。構文エラーがない場合は、インスタンス オブジェクトがプロトタイプ オブジェクトの name 属性を呼び出すため、別の this is B がポップアップ表示されます。

    返事
    0
  • キャンセル返事