javascript - js スコープセーフ コンストラクターの問題
phpcn_u1582
phpcn_u1582 2017-05-19 10:15:29
0
4
503
リーリー

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

phpcn_u1582
phpcn_u1582

全員に返信(4)
曾经蜡笔没有小新

スタート

リーリー

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
淡淡烟草味

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
習慣沉默

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

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

いいねを押す +0
巴扎黑
  • これを印刷すると理由がわかります

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

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

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート