某草草2017-05-19 10:43:16
混乱の理由は 3 つあります:
まず、定義した name 属性です。関数自体には name とも呼ばれるそのような属性があり、この問題の理解を混乱させます。
次に、プロトタイプはよく理解されていません。関数のプロトタイプで定義されたプロパティについては、インスタンス化後のオブジェクト (つまり、新しい操作) のみが、「variable.property」メソッドを使用してその値を取得できます。
第三に、これはよく理解されていません。これはメソッドを呼び出すオブジェクトを指します
質問に答える前に、例を見てみましょう
リーリー問題を 1 つずつ分析してみましょう (確認するには Chrome ブラウザの開発者ツールを使用してください)
B.callname() は何を出力しますか?
リーリーB は関数であり、その name="B"、B.callname メソッドが呼び出され、呼び出し元が B である場合、callname メソッド内のこれは B を参照します。B.name が何であるかを覚えていますか? 上の最初の例を見て理解してください。
リーリーなぜ「this is B」が B.prototype.name で定義されていないのかと疑問に思うでしょう。 B のプロトタイプで定義されたプロパティには、B のインスタンスからのみ直接アクセスできるためです。
それでも信じられない場合は、xname などの名前をすべて変更してください。そうすれば、この質問に対する答えは未定義になります
a.callname() 何を出力しますか?
リーリーa 自体は JSON で定義されたオブジェクト インスタンスです。 上記のコードは
と同等です リーリーcallname の呼び出し元は a なので、callname 内のこれは a です
リーリー(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 属性値を見つけて返します。
迷茫2017-05-19 10:43:16
最初のものでは、this is a がポップアップします。2 つ目のものでは、B は関数 B を表し、3 つ目のものでは、this is B が最初にポップアップします。インスタンス化するときに関数が実行されるためです。この場合、前のステートメント (new B()) にセミコロンがないため、構文エラーが発生します。構文エラーがない場合は、インスタンス オブジェクトがプロトタイプ オブジェクトの name 属性を呼び出すため、別の this is B がポップアップ表示されます。