我在一開始看到javascript的函數apply和call時,非常的模糊,看也看不懂,最近在網上看到一些文章對apply方法和call的一些示例,總算是看的有點眉目了,在這里我做如下筆記,希望和大家分享.. 如有什么不對的或者說法不明確的地方希望讀者多多提一些意見,以便共同提高..
主要我是要解決一下幾個問題:
1.apply和call的區別在哪里
2.什么情況下用apply,什么情況下用call
3.apply的其他巧妙用法(一般在什么情況下可以使用apply)
我首先從網上查到關于apply和call的定義,然后用示例來解釋這兩個方法的意思和如何去用.
apply:方法能劫持另外一個對象的方法,繼承另外一個對象的屬性.
Function.apply(obj,args)方法能接收兩個參數
obj:這個對象將代替Function類里this對象
args:這個是數組,它將作為參數傳給Function(args-->arguments)
call:和apply的意思一樣,只不過是參數列表不一樣.
Function.call(obj,[param1[,param2[,…[,paramN]]]])
obj:這個對象將代替Function類里this對象
params:這個是一個參數列表
1.apply示例:
<script type="text/javascript"> /*定義一個人類*/ function Person(name,age) { this.name=name; this.age=age; } /*定義一個學生類*/ functionStudent(name,age,grade) { Person.apply(this,arguments); this.grade=grade; } //創建一個學生類 var student=new Student("qian",21,"一年級"); //測試 alert("name:"+student.name+"/n"+"age:"+student.age+"/n"+"grade:"+student.grade); //大家可以看到測試結果name:qian age:21 grade:一年級 //學生類里面我沒有給name和age屬性賦值啊,為什么又存在這兩個屬性的值呢,這個就是apply的神奇之處. </script>分析: Person.apply(this,arguments);
this:在創建對象在這個時候代表的是student
arguments:是一個數組,也就是[“qian”,”21”,”一年級”];
也就是通俗一點講就是:用student去執行Person這個類里面的內容,在Person這個類里面存在this.name等之類的語句,這樣就將屬性創建到了student對象里面
2.call示例
在Studen函數里面可以將apply中修改成如下:
Person.call(this,name,age);
這樣就ok了
3.什么情況下用apply,什么情況下用call
在給對象參數的情況下,如果參數的形式是數組的時候,比如apply示例里面傳遞了參數arguments,這個參數是數組類型,并且在調用Person的時候參數的列表是對應一致的(也就是Person和Student的參數列表前兩位是一致的) 就可以采用 apply , 如果我的Person的參數列表是這樣的(age,name),而Student的參數列表是(name,age,grade),這樣就可以用call來實現了,也就是直接指定參數列表對應值的位置(Person.call(this,age,name,grade));
新聞熱點
疑難解答
圖片精選