javascriptの中でapply方法とcall方法の作用とprototype.jsの中の応用
4269 ワード
白点とは、オブジェクトの内部ポインタを変更すること、オブジェクトのthisの方向を変更することです.これはオブジェクト指向のjsプログラミングの過程で時々有用である.
call関数とapplyメソッドの最初のパラメータは、現在のオブジェクトや関数の内部に入るthisです.後ろのパラメータは現在のオブジェクトに渡すパラメータです.
applyとcallの両方については役割は同じですが、両者はパラメータに違いがあります.最初のパラメータの意味は同じですが、2番目のパラメータ:applyはパラメータ配列、つまり複数のパラメータを組み合わせて1つの配列にして入ってきます.callはcallのパラメータとして入ってきます.func.call(func 1,var 1,var 2,var 3)に対応するappyは、func.appy(func 1,var 2,var 3)と表記されています.同時にappyを使用する利点は、現在の関数のargmentsオブジェクトを直接appyの2番目のパラメータとして導入することができます.
(reference:http://www.cnblogs.com/beyondnet/archive/2007/12/06/985216.html)
TEST:
function cls 1(){ this.b='111' this.cc='222' this.d='333' this.f=function() { alert("nihao")}}function cls 2(){ this.a='aaa' cls 1.apply(this)//ここではクラス(関数としても直接見ることができます)を使って直接にapplyに来ます.例ではありません.この場合、cls 2類は所有します. cls 1クラスのすべての属性と方法. } var st=new cls 2();alert(st.d);
/*ここでは、第2のクラスにおいて、すべての属性と方法のコピーを最初のクラスの名前で行うことができます.方法は、次のようにコピーできます.ss.f.apply.正常に動作します.属性s.cp.appy(this).エラーが発生します.
function cls 2(){ this.a='aaa' var ss=new cls 1 s.caply(this);/ここではエラーが発生します.s.f.apply(this)であれば正しいです.属性であれば、類名を使います.方法であれば、つまり、 利用可能なクラス名も、例示的な方法の形式で使用されるべきである(var ss=new cls 1;s.f.apply(this).)
以下のような形です. } var st=new cls 2();alert(s.c);
****正確****function cls 2(){ this.a='aaa' cls 1.apply(this);/属性であれば、クラス名を使用し、方法であれば、クラス名を使用しても良いし、例を加えた方法でもいいです.
)
var st=new cls 2()
alert(s.c)
グウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウ
function simple AppleyDemo(sim){this.simuname=sim;}function handleSPA(hand){ this.hand_name=hand;simple Apple Demo.apple(this,new Aray); //ここではクラス名を使います.
//ここでは、Aray()配列を用いて、この配列の初期化値をシンプルなAppleyDemo関数に付与するパラメータです.つまり、sim=222222222222222222です.JSマニュアルでは、Argaraはオプションであり、この関数に伝達されるパラメータ配列として解釈されます.
alert(this.simuname);
handleSPA()
上の方法は下の方法と同じ効果を実現します.
function simple AppleyDemo(sim){this.simuname=sim;}function handleSPA(hand){ this.hand_name=hand;simpleAppleyDemo.apple(this,argments); //ここではクラス名を使います.
//ここでargmentsというのは、handleSPA('55555555')の5555555をargments(argments)として自分のパラメータの集合です.ここでは5555555を表します.argmentsをsimpleappyDemo()に伝えます.つまり、sim=argments=555*/
alert(this.simuname);
handleSPA('555555')
call方法はmsdnで説明します. オブジェクトを呼び出す方法は、現在のオブジェクトを別のオブジェクトに置き換える方法です.appy方法はmsdnの解釈にあるオブジェクトを適用する方法で、現在のオブジェクトを別のオブジェクトに置き換える方法です.この説明も非常に抽象的です.この2つの方法の役割は基本的に同じです.例を挙げるとfunction cls 1(){ this.a='123';cls 1.prototype.fun 1=function() alert(this.a);function cls 2(){ this.a='456';var o 1=new cls 1();var o 2=new cls 2();o 1.fun 1.appy(o 2);/ここでは実例名を使っています.o 1.apply(o 2)と書くとエラー はo 1の対象のクラスのcls 1だけがfun 1という方法がありますが、この場合はo 2のオブジェクトをO 1の対象に代える必要がありますので、この時に表示されるthis.aは456になります.非常に不思議ですよね.コール方法に変えても同じです.この2つの方法の違いはパラメータの使い方だけで、ここでは説明しません.otototype.jsでvarクラスを見ました. create:function(){ return function(){ this.initialize.apply(this,argments); } } } このコードは、かなり誇張されています.多くの人がこのbtのコードに惑わされやすいです.その理由を詳しく分析しても、明らかにこの書き方はClassが声明のObjectオブジェクトです.createはこのojectオブジェクトの属性です.この属性は関数です.この関数は実行後に一つの関数を返します.このように説明するのは複雑すぎるかもしれません.もう一つのテストをしてもいいです.var x=function(){return function}{alert(123)}}var n=x();面白いでしょう.ここでnはx関数が実行された後に返される関数の一つです.nは現在function(zergth)に等しくなりました.この文は何の意味を表していますか?実は、まずprototype.jsでどうやって呼び出されたかを見てみます.var Template=Class.creat();Template.prototype={ initialize:function(template、pattern){ this.template=template.toString() this.pattern = pattern𞓜Template.Pattern; },....コードを省略したいくつかのvar template=new Template(replaccement);最初の文Class.reate();Templateに返す関数で、この関数はfunction(){ this.initialize.apply(this,argments); } var template=new Templateを実行すると、この関数を実行することになりますが、この関数の役割は現在のクラスのinitializeという関数を実行するので、prototype.jsの各クラスはTemplate.prototype={ initialize:function(template、pattern){ this.template=template.toString() this.pattern = pattern𞓜Template.Pattern; },.... このような関数は、これがないとプログラムが間違っています.だから、なぜこのように書くのですか?一般的に私達が声明している時はfunciton fun(){}var o=new fun();このようにfunはまた類であり、構造関数でもあるので、このような友好的ではないコード案を分けるために、prototype.jsはこのような方法を使いました.
call関数とapplyメソッドの最初のパラメータは、現在のオブジェクトや関数の内部に入るthisです.後ろのパラメータは現在のオブジェクトに渡すパラメータです.
applyとcallの両方については役割は同じですが、両者はパラメータに違いがあります.最初のパラメータの意味は同じですが、2番目のパラメータ:applyはパラメータ配列、つまり複数のパラメータを組み合わせて1つの配列にして入ってきます.callはcallのパラメータとして入ってきます.func.call(func 1,var 1,var 2,var 3)に対応するappyは、func.appy(func 1,var 2,var 3)と表記されています.同時にappyを使用する利点は、現在の関数のargmentsオブジェクトを直接appyの2番目のパラメータとして導入することができます.
(reference:http://www.cnblogs.com/beyondnet/archive/2007/12/06/985216.html)
TEST:
function cls 1(){ this.b='111' this.cc='222' this.d='333' this.f=function() { alert("nihao")}}function cls 2(){ this.a='aaa' cls 1.apply(this)//ここではクラス(関数としても直接見ることができます)を使って直接にapplyに来ます.例ではありません.この場合、cls 2類は所有します. cls 1クラスのすべての属性と方法. } var st=new cls 2();alert(st.d);
/*ここでは、第2のクラスにおいて、すべての属性と方法のコピーを最初のクラスの名前で行うことができます.方法は、次のようにコピーできます.ss.f.apply.正常に動作します.属性s.cp.appy(this).エラーが発生します.
function cls 2(){ this.a='aaa' var ss=new cls 1 s.caply(this);/ここではエラーが発生します.s.f.apply(this)であれば正しいです.属性であれば、類名を使います.方法であれば、つまり、 利用可能なクラス名も、例示的な方法の形式で使用されるべきである(var ss=new cls 1;s.f.apply(this).)
以下のような形です. } var st=new cls 2();alert(s.c);
****正確****function cls 2(){ this.a='aaa' cls 1.apply(this);/属性であれば、クラス名を使用し、方法であれば、クラス名を使用しても良いし、例を加えた方法でもいいです.
)
var st=new cls 2()
alert(s.c)
グウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウグウ
function simple AppleyDemo(sim){this.simuname=sim;}function handleSPA(hand){ this.hand_name=hand;simple Apple Demo.apple(this,new Aray); //ここではクラス名を使います.
//ここでは、Aray()配列を用いて、この配列の初期化値をシンプルなAppleyDemo関数に付与するパラメータです.つまり、sim=222222222222222222です.JSマニュアルでは、Argaraはオプションであり、この関数に伝達されるパラメータ配列として解釈されます.
alert(this.simuname);
handleSPA()
上の方法は下の方法と同じ効果を実現します.
function simple AppleyDemo(sim){this.simuname=sim;}function handleSPA(hand){ this.hand_name=hand;simpleAppleyDemo.apple(this,argments); //ここではクラス名を使います.
//ここでargmentsというのは、handleSPA('55555555')の5555555をargments(argments)として自分のパラメータの集合です.ここでは5555555を表します.argmentsをsimpleappyDemo()に伝えます.つまり、sim=argments=555*/
alert(this.simuname);
handleSPA('555555')
call方法はmsdnで説明します. オブジェクトを呼び出す方法は、現在のオブジェクトを別のオブジェクトに置き換える方法です.appy方法はmsdnの解釈にあるオブジェクトを適用する方法で、現在のオブジェクトを別のオブジェクトに置き換える方法です.この説明も非常に抽象的です.この2つの方法の役割は基本的に同じです.例を挙げると