このコードは、JS Elevation 3 の P598-599 の例です。私が聞きたいのは、なぜアラートが未定義なのかということです。
スタート
Rectangle と入力します。これは新しいオブジェクトを指し、object1 と名付けます
object1の名前に「Polygon」と入力します
object1 のプロトタイプは Rectangle なので、else に移動します
もう一度「Polygon」と入力します。これは新しいオブジェクトを指し、それを object2 と呼びます
object2 のプロトタイプは Polygon なので、object2 は sides 和 getArea
sides
getArea
object1のテリトリーに戻り、Polygon.call(this,2);object2に戻り、そして…そして捨てます。
Polygon.call(this,2);
次に object1 を与えます undefined 的 width、height 和 getArea 。
undefined
width
height
ついに、rect が object1 を取得しました
ソリューションを追加して、Rectangle に Polygon のプロトタイプを共有させます
Rectangle では、Polygon の this を Rectangle の this にポイントします。 Rectangle がコンストラクターとして使用される場合、this は Rectangle のインスタンス、つまりこの例では rect を参照します。Polygon のプロトタイプは、rect のプロトタイプ チェーン上にありません。つまり、この instanceof Polygon は false であるため、else で返された new Polygon(sides) が使用され、side はインスタンスにアタッチされないため、rect インスタンスには Side 属性は存在しません。 Rectangle(with,height)もありますが、幅が間違って書かれています
あなたの例では、Polygon は干渉アイテムであり、Rectangle にはまったく影響しません。
削除してくださいPolygon.call(this,2);もう一度見てください、理由がわかりますか
これを印刷すると理由がわかります
this.sides=sides は Polygon に掛けられています
return new Polygon(sides);//これは呼び出されたときに Rectangle ではなくなります
スタート
リーリーRectangle と入力します。これは新しいオブジェクトを指し、object1 と名付けます
に実行されました リーリーobject1の名前に「Polygon」と入力します
リーリーobject1 のプロトタイプは Rectangle なので、else に移動します
リーリーもう一度「Polygon」と入力します。これは新しいオブジェクトを指し、それを object2 と呼びます
object2 のプロトタイプは Polygon なので、object2 は
となります。sides
和getArea
object1のテリトリーに戻り、
リーリーPolygon.call(this,2);
object2に戻り、そして…そして捨てます。次に object1 を与えます
undefined
的width
、height
和getArea
。ついに、rect が object1 を取得しました
ソリューションを追加して、Rectangle に Polygon のプロトタイプを共有させます
リーリーRectangle では、Polygon の this を Rectangle の this にポイントします。 Rectangle がコンストラクターとして使用される場合、this は Rectangle のインスタンス、つまりこの例では rect を参照します。Polygon のプロトタイプは、rect のプロトタイプ チェーン上にありません。つまり、この instanceof Polygon は false であるため、else で返された new Polygon(sides) が使用され、side はインスタンスにアタッチされないため、rect インスタンスには Side 属性は存在しません。
Rectangle(with,height)もありますが、幅が間違って書かれています
あなたの例では、Polygon は干渉アイテムであり、Rectangle にはまったく影響しません。
削除してください
Polygon.call(this,2);
もう一度見てください、理由がわかりますかこれを印刷すると理由がわかります
this.sides=sides は Polygon に掛けられています
return new Polygon(sides);//これは呼び出されたときに Rectangle ではなくなります