深度分析javascript call方法は継承の原理を実現します.
2221 ワード
callの方法はよくあることよりもjavascriptの難点の一つです.以前は継承ができることだけを知っていましたが、原理を深く研究したことはありません.ネット上でも方法を言っただけで、その原理を話していません.今日は大丈夫です.コールの方法で最も一般的なのは面接の問題の一つです.以下は二つの簡単な継承の実現例である.
まずオフィシャル文書を見て、コールの方法について説明します.
コール()は、現在呼び出されている関数/メソッドに新しいthis値を提供します.
つまり、callメソッドはaのthisオブジェクトをbのthisオブジェクトに置き換えていますが、少し回り道していますか?
しかし、なぜbtがa関数内にアクセスできるのかはまだ説明できません.a関数内の方法はaの例だけです.a関数も実装されていますか?
この問題を明らかにするには、まずnewというキーワードは何をしていますか?
function b(){this.name="b";this.sayName="="="{consolie.logs('this.name',this.name);var bt=new b();
consolone.log(bt)
newキーワードでオブジェクトを作成し、すべてのthisキーワードの属性を新しいオブジェクトの属性を生成することができます.つまりnewキーワードは、すべてのthisに関する属性を新しいオブジェクトの属性に変換します.call方法でbのthisオブジェクトをaメソッドに割り当てた場合、newも検出されます.そして、bの属性として一期実例化します.試してみます.demo 1コードを例にとって、bを出力してください.
推測が正確であるため、継承方式のcallはthisオブジェクトを置き換えるだけの役割を果たしています.主な仕事はnewキーワードです.自動的に検出して、thisバインディングの属性を検出できます.すべてを実装対象に追加します.上のコードと下のコードの効果は同じです.
コードワードは簡単ではないです.いいです.行ってください.
demo1:
function a(){
this.name = function(){
console.log('a',this.namevalue,this.age)
}
}
function b(){
a.call(this); // this b
}
var bt = new b();
bt.name();
demo 2: function Product(name, price) {
this.name = name;
this.price = price;
}
function Food(name, price) {
Product.call(this, name, price);
this.category = 'food';
}
function Toy(name, price) {
Product.call(this, name, price);
this.category = 'toy';
}
var cheese = new Food('feta', 5);
var fun = new Toy('robot', 40);
bにa.cal(this)を追加するだけで見られます.そのまま実用化すれば継承は可能ですが、なぜですか?まずオフィシャル文書を見て、コールの方法について説明します.
コール()は、現在呼び出されている関数/メソッドに新しいthis値を提供します.
つまり、callメソッドはaのthisオブジェクトをbのthisオブジェクトに置き換えていますが、少し回り道していますか?
しかし、なぜbtがa関数内にアクセスできるのかはまだ説明できません.a関数内の方法はaの例だけです.a関数も実装されていますか?
この問題を明らかにするには、まずnewというキーワードは何をしていますか?
function b(){this.name="b";this.sayName="="="{consolie.logs('this.name',this.name);var bt=new b();
consolone.log(bt)
newキーワードでオブジェクトを作成し、すべてのthisキーワードの属性を新しいオブジェクトの属性を生成することができます.つまりnewキーワードは、すべてのthisに関する属性を新しいオブジェクトの属性に変換します.call方法でbのthisオブジェクトをaメソッドに割り当てた場合、newも検出されます.そして、bの属性として一期実例化します.試してみます.demo 1コードを例にとって、bを出力してください.
function a(){
this.namevalue=19;
this.name = function(){
console.log('a',this.namevalue,this.age)
}
}
function b(){
this.age=19;
a.call(this); // this b
}
var bt = new b();
console.log(bs)
出力:推測が正確であるため、継承方式のcallはthisオブジェクトを置き換えるだけの役割を果たしています.主な仕事はnewキーワードです.自動的に検出して、thisバインディングの属性を検出できます.すべてを実装対象に追加します.上のコードと下のコードの効果は同じです.
function b(){
this.namevalue=19;
this.name = function(){
console.log('a',this.namevalue,this.age)
}
this.age=19;
a.call(this); // this b
}
var bs = new b();
console.log(bs)
今日はコールに対してもっと深く理解しました.完全に自己理解です.もし違った見解があれば、コメントを歓迎します.コードワードは簡単ではないです.いいです.行ってください.