検索

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

javascript - これと JS のコンストラクターの問題

リーリー

コード内でコメントされているように、superSay.call(this)People.prototype.say 関数が呼び出されるのはなぜですか? this は誰を指しますか?

我想大声告诉你我想大声告诉你2833日前813

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

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-06-26 10:55:14

    これは検証のために Student{}类,这个你可以在superSay.call(this)上面加一行console.log(this) を指します。

    それでは、このコードを見てみましょう

    リーリー

    後の説明の便宜上、ここでは new People() で作成したインスタンスを Instance X と呼びます。 new People()创建的实例称为实例X
    由于superSay = Student.prototype.say,因为上面的Student.prototype = new People();,所以其中Student.prototype实例X
    所以实际上superSay调用的是实例Xsay,而并非People.prototype.say superSay = Student.prototype.say であるため、上記の Student.prototype = new People(); であるため、 Student.prototypeインスタンス X

    実際には、superSayPeople.prototype.say ではなく、Instance Xsay を呼び出します。

    People.prototype.say,主要还是原型链的问题。实例X是People类的一个实例,所以实例X的所有方法会从People类的原型链“继承”(用继承这个词,但是实际上JS的原型链和继承还是有些区别的)。所以实例X.say如果没有针对实例X重写say方法,那么实例Xsay就和People.prototype.sayなぜ

    に電話するのと同じだと思うかというと。

    superSay.call(this)这个里面的call,只是改变了this的上下文而已。但是由于superSay实例X.say,这个方法里根本没有this,所以thisさらに、

    コンテキストを変更しても、実行結果には影響しません。

    🎜

    返事
    0
  • 迷茫

    迷茫2017-06-26 10:55:14

    この問題はjsでよく発生します

    返事
    0
  • 代言

    代言2017-06-26 10:55:14

    個人的な意見: まず、say メソッドを見つけるための検索シーケンスについて話しましょう: s——student.prototype——people.prototype——Object が見つかると、準備が完了し、検索を停止します。コードと組み合わせると、student.prototype のみが検索されます。ここで、わかりやすくするために、まずコードを次のように変更します:

    リーリー

    その他は変更ありません。このとき、s.say() - 321 を出力、s.jiao() - 456 を出力します。次にコードに戻ります。sdudent.prototype.say メソッドをオーバーライドしているため、このコードが実行されます

    リーリー

    最初の文 superSay.call(this)、最初の superSay は変数、変数の型は関数です。var superSay = Student.prototype.say の後にコード console.log(typeof supperSay) を追加できます。この関数を呼び出すと、この変数に Student.prototype.say が格納されます。 var superSay = Student.prototype.say を実行します。実際、ここで割り当てられる値は People.prototype.say です。この点は『立面図』166~167ページでも同様です。この点に関しては、コードのこれら 2 つのセクションをこれに変更し、残りは変更しないでください。

    リーリー

    var superSay = Student.prototype.say が実行されると、student.prototype にはコンストラクター属性が 1 つしかなく、say メソッドがないため、この時点で superSay を呼び出すとエラーが報告されます。次に、コードに戻ると、People.prototype.say が superSay に割り当てられます

    リーリー

    返事
    0
  • 我想大声告诉你

    我想大声告诉你2017-06-26 10:55:14

    これを superSay コンストラクターで Student.prototype.にバインドします

    返事
    0
  • PHP中文网

    PHP中文网2017-06-26 10:55:14

    投稿者が上の階の話に騙されるのが怖くないですか?

    彼のプログラムでは、stuSay は匿名関数オブジェクト function () {alert("hello");} を指します。stuSay を再割り当てしない限り、どこで呼び出しても、この関数オブジェクトは常にこの関数オブジェクトを指します。結果として、これが関数本体内で誰を指しているのかについては、Rhinoceros の本を読んでください...

    Rhinoceros の本の機能部分を読んだ後、投稿者はこれらの問題を抱えなくなります。2 階の非常にナンセンスな内容に関して、投稿者をめまいさせないでください。

    返事
    0
  • キャンセル返事