以下是我要幫大家整理的Js apply()使用,有興趣的同學可以去看看。
Js apply方法詳解
我在一開始看到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[
## Function.call(obj,[param1[,param2[## Function). ])
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);##在Studen函數裡面可以將apply中修改如下:
vararr1=new Array("1","2","3"); vararr2=new Array("4","5","6"); Array.prototype.push.apply(arr1,arr2);這樣就ok了 3.什麼情況下用apply,什麼情況下用call 在給對象參數的情況下,如果參數的形式是數組的時候,比如apply範例裡面傳遞了參數arguments,這個參數是數組類型,並且在調用Person的時候參數的列表是對應一致的(也就是Person和Student的參數列表前兩位是一致的) 就可以採用 apply , 如果我的Person的參數列表是這樣的(age,name),而Student的參數列表是(name,age,grade),這樣就可以用call來實現了,也就是直接指定參數列表對應值的位置(Person.call (this,age,name,grade)); 4.apply的一些其他巧妙用法 細心的人可能已經察覺到,在我調用apply方法的時候,第一個參數是物件(this), 第二個參數是一個陣列集合, 在呼叫Person的時候,他需要的不是一個陣列,但是為什麼他給我一個陣列我仍然可以將陣列解析為一個一個的參數, 這個就是apply的一個巧妙的用處,可以將一個陣列預設的轉換為一個參數列表([param1,param2,param3] 轉換為 param1,param2,param3) 這個如果讓我們用程式來實現將陣列的每一個項,來裝換為參數的列表,可能都得費一會功夫,借助apply的這點特性,所以就有了以下高效率的方法: # a)Math.max 可以實現得到數組中最大的一項 因為Math.max 參數裡面不支援Math.max([param1,param2]) 也就是數組 #但是它支援Math.max(param1,param2,param3…),所以可以根據剛才apply的那個特點來解決 var max=Math.max.apply(null,array),這樣輕易的可以得到一個數組中最大的一項 ## ####(apply會將一個數組裝換成一個參數接著一個參數的傳遞給方法) ####
这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去
b)Math.min 可以实现得到数组中最小的一项
同样和 max是一个思想 var min=Math.min.apply(null,array);
c)Array.prototype.push 可以实现两个数组合并
同样push方法没有提供push一个数组,但是它提供了push(param1,param,…paramN) 所以同样也可以通过apply来装换一下这个数组,即:
vararr1=new Array("1","2","3"); vararr2=new Array("4","5","6"); Array.prototype.push.apply(arr1,arr2);
也可以这样理解,arr1调用了push方法,参数是通过apply将数组装换为参数列表的集合.
通常在什么情况下,可以使用apply类似Math.min等之类的特殊用法:
一般在目标函数只需要n个参数列表,而不接收一个数组的形式([param1[,param2[,…[,paramN]]]]),可以通过apply的方式巧妙地解决这个问题!
5.总结:
一开始我对apply 非常的不懂,最后多看了几遍,自己多敲了几遍代码,才明白了中间的道理,所以,不管做什么事情,只要自己肯动脑子,肯动手敲代码,这样一个技术就会掌握…
还有比如第四部分得内容,巧妙的解决了实实在在存在的问题,这个肯定不是一个初学者能想到的解决方案(这个也不是我自己想的),没有对编程有一定认识的不会想到这个的,还是一句话,多积累,多学习,提升自己的能力和对编程思想的理解能力才是最关键!
上面是我整理给大家的Js apply()使用,希望今后会对大家有帮助。
相关文章:
以上是詳細講解Js apply()使用(含代碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!