本の簡単なjsは面接試験の問題を受け継いで、あなたが本当に徹底的に継承することを知っていますか?
2404 ワード
直接テーマを貼りましょう.
consolone.log('b 2',b 2)
consolie.log(b 1.name)/change consolove.log(b.2 name)//a consolone.log(b 1.co lor)///''green''yellow','black''はconsolove.logn(b.green',yellow','black'
これは実は私達のよくある継承モードの一つです.原型継承はなぜこのような状況が現れますか?最大の疑惑は、なぜ2つのインスタンスオブジェクトb 1、b 2の中のカラー属性が修正されたのですか?どうしてb 1.name=changeなのにb.nameは変わりませんでした.まず、あなたがプロトタイプチェーンで継承されるべき知識点があります.この知識点があったら、私たちはよく口にする基本的なデータの種類と引用データの種類を理解します.彼らの記憶方法と読み取り方法はどう違っていますか?
上の図を見ると、基本的なデータの種類であれ、引用タイプであれ、実際にはスタックメモリが存在していますが、引用データの種類は具体的なスタックを指しています.彼らの違いを簡単に述べます.
上のコードはどのように実行されますか?まず、b 1とb 2の実用化は、スタックメモリ内に存在し、その後、スタックメモリの2つのオブジェクトを指します.しかし、この2つのオブジェクトのプロトタイプは同じインスタンスオブジェクトを指しており、このインスタンスオブジェクトは同じスタックメモリ内に存在している(次いでオブジェクトを指している).したがって、b 1とb 2のプロトタイプオブジェクトは、同じインスタンスオブジェクト(Aのインスタンスオブジェクト)を指している.
カラー属性が同じ引用タイプに向けられている問題をどう回避しますか?実は上の方は継承の中の一つのプロトタイプチェーンで継承する方法です.もう一つの相続は構造関数の継承によって少し修正されます.
Aを呼び出して、インスタンスAではなく、A()ですが、この時Aのthisはwindowオブジェクトではなく、ここにはインスタンスAがありません.したがって、thisはAの実用化されたオブジェクトではありません.そして、Aという関数の実行時にコンテキストを実行するthis実行を修正したと考えられています.このthisは、ここでb 1またはb 2のインスタンスオブジェクトとなります.
この時、私達はb 1.co lorを修正した時、同じように原型に行って色を探しますが、この時、原型チェーン上のthisはb 1という実用化対象を指しています.だから、b 1.com lorを修正した時、実際にはb 1という実用化対象の対応原型上の対象だけを修正しました.b.2色は変わらない.偏重してthisの指向問題を理解します.
function A() {
this.name = 'a'
this.color = ['green', 'yellow']
}
function B() {
}
B.prototype = new A()
var b1 = new B()
var b2 = new B()
b1.name = 'change'
b1.color.push('black')
consolone.log('b 1',b 1)consolone.log('b 2',b 2)
consolie.log(b 1.name)/change consolove.log(b.2 name)//a consolone.log(b 1.co lor)///''green''yellow','black''はconsolove.logn(b.green',yellow','black'
これは実は私達のよくある継承モードの一つです.原型継承はなぜこのような状況が現れますか?最大の疑惑は、なぜ2つのインスタンスオブジェクトb 1、b 2の中のカラー属性が修正されたのですか?どうしてb 1.name=changeなのにb.nameは変わりませんでした.まず、あなたがプロトタイプチェーンで継承されるべき知識点があります.この知識点があったら、私たちはよく口にする基本的なデータの種類と引用データの種類を理解します.彼らの記憶方法と読み取り方法はどう違っていますか?
上の図を見ると、基本的なデータの種類であれ、引用タイプであれ、実際にはスタックメモリが存在していますが、引用データの種類は具体的なスタックを指しています.彼らの違いを簡単に述べます.
上のコードはどのように実行されますか?まず、b 1とb 2の実用化は、スタックメモリ内に存在し、その後、スタックメモリの2つのオブジェクトを指します.しかし、この2つのオブジェクトのプロトタイプは同じインスタンスオブジェクトを指しており、このインスタンスオブジェクトは同じスタックメモリ内に存在している(次いでオブジェクトを指している).したがって、b 1とb 2のプロトタイプオブジェクトは、同じインスタンスオブジェクト(Aのインスタンスオブジェクト)を指している.
b1.name = 'change'
実際にはb 1のインスタンスオブジェクトに属性nameを追加し、name属性をchangeとして割り当てたが、プロトタイプチェーン上のname属性は修正されていない.b1.color.push('black')
ここでは、プロトタイプチェーンの上に属性を検索するための知識点に関して、インスタンスオブジェクトb 1にはカラー属性がないので、プロトタイプチェーン上で探した結果、Aの例示的なオブジェクトでカラーが見つかったが、この時のカラー属性は参照タイプを指し、b 1とb 2はいずれもAの実例的なオブジェクトに引き継がれ、参照タイプカラーによって、ブロック群を指す.b 1がプロトタイプのカラー属性を修正すると、実際にb 2上のカラー属性が修正されます.更に強調すると、カラー属性は原型オブジェクト上の参照タイプの属性であるため、同じ配列オブジェクトを指しています.カラー属性が同じ引用タイプに向けられている問題をどう回避しますか?実は上の方は継承の中の一つのプロトタイプチェーンで継承する方法です.もう一つの相続は構造関数の継承によって少し修正されます.
function B() {
A.call(this)
}
変更された後、私たちは毎回インスタンスBの時に、インスタンス化対象の参照対象をパラメータとしてBというコンストラクターに伝達し、間接的にA関数を呼び出した時に、A実行時のthisの実行問題も修正しました.この時点でthisの実行はwindowではなく、実用化されたオブジェクトb 1またはb 2である.分析してみると、A.cal(this)というコードを書かないとき、Aのインスタンスオブジェクトは実際にAのインスタンスのオブジェクト自体を指しています.この言葉はちょっと自慢しています.A.cal(this)を実行した後、ここで翻訳してきたのです.間違いがあるか?Aを呼び出して、インスタンスAではなく、A()ですが、この時Aのthisはwindowオブジェクトではなく、ここにはインスタンスAがありません.したがって、thisはAの実用化されたオブジェクトではありません.そして、Aという関数の実行時にコンテキストを実行するthis実行を修正したと考えられています.このthisは、ここでb 1またはb 2のインスタンスオブジェクトとなります.
この時、私達はb 1.co lorを修正した時、同じように原型に行って色を探しますが、この時、原型チェーン上のthisはb 1という実用化対象を指しています.だから、b 1.com lorを修正した時、実際にはb 1という実用化対象の対応原型上の対象だけを修正しました.b.2色は変わらない.偏重してthisの指向問題を理解します.