検索

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

javascript - js スコープセーフ コンストラクターの問題

リーリー

このコードは、JS Elevation 3 の P598-599 の例です。
私が聞きたいのは、なぜアラートが未定義なのかということです。

phpcn_u1582phpcn_u15822821日前506

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

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-19 10:17:29

    スタート

    リーリー

    Rectangle と入力します。これは新しいオブジェクトを指し、object1 と名付けます

    に実行されました リーリー

    object1の名前に「Polygon」と入力します

    リーリー

    object1 のプロトタイプは Rectangle なので、else に移動します

    リーリー

    もう一度「Polygon」と入力します。これは新しいオブジェクトを指し、それを object2 と呼びます

    object2 のプロトタイプは Polygon なので、object2 は sidesgetArea

    となります。

    object1のテリトリーに戻り、Polygon.call(this,2);object2に戻り、そして…そして捨てます。

    リーリー

    次に object1 を与えます undefinedwidthheightgetArea

    ついに、rect が object1 を取得しました

    ソリューションを追加して、Rectangle に Polygon のプロトタイプを共有させます

    リーリー

    返事
    0
  • 淡淡烟草味

    淡淡烟草味2017-05-19 10:17:29

    Rectangle では、Polygon の this を Rectangle の this にポイントします。 Rectangle がコンストラクターとして使用される場合、this は Rectangle のインスタンス、つまりこの例では rect を参照します。Polygon のプロトタイプは、rect のプロトタイプ チェーン上にありません。つまり、この instanceof Polygon は false であるため、else で返された new Polygon(sides) が使用され、side はインスタンスにアタッチされないため、rect インスタンスには Side 属性は存在しません。
    Rectangle(with,height)もありますが、幅が間違って書かれています

    返事
    0
  • 習慣沉默

    習慣沉默2017-05-19 10:17:29

    あなたの例では、Polygon は干渉アイテムであり、Rectangle にはまったく影響しません。

    削除してくださいPolygon.call(this,2);もう一度見てください、理由がわかりますか

    返事
    0
  • 巴扎黑

    巴扎黑2017-05-19 10:17:29

    • これを印刷すると理由がわかります

    • this.sides=sides は Polygon に掛けられています

    • return new Polygon(sides);//これは呼び出されたときに Rectangle ではなくなります

    リーリー

    返事
    0
  • キャンセル返事