apply()方法call()方法的作用和比較


apply()方法的定義:

1. apply()方法能劫持另外一個對象的方法,繼承另外一個對象的屬性
2.Function.apply(obj,args)方法能接收兩個參數
3.obj:這個對象將代替Function類里this對象
4.args:這個是數組,它將作為參數傳給Function(args–>arguments)

   function Person(){
        this.name="木木"
        this.age='18'
        console.log(this.sex)
        console.log(this)

        }
        let obj={
        sex:"男"
        }
        Person.apply(obj)//男  {age:'18',name:'木木',sex:'男'}
        console.log(obj)//{age:'18',name:'木木',sex:'男'}
        console.log(obj.name)//木木

從運行結果上看:

1. Person()繼承了obj的屬性,obj也繼承了Person()的屬性,

2. apply()不只是繼承obj的屬性,而且還繼承了Person()的屬性,

3. this指向的既不是obj也不是Person(),指向的應該是繼承了Person()和obj屬性的一個新的對象。

准確的來說,apply()的作用就是合並方法和對象的方法和屬性,並將方法和對象的this指向合並后的對象。

apply方法和call方法。函數屬性與方法。

每個函數都有length屬性哥prototype屬性。

length屬性表示的是函數接入參數的個數

在es引用類型語言中,prototype是保存它們所有實例方法的真正所在。換句話來說,類似於toString()和valueOf()等方法實際上都存在prototype名下,只不過是通過各自對象的實例訪問罷了。在創建自定義類型以及實現繼承時,prototype屬性的作用是極為重要的。在es5中prototype屬性是不可以枚舉的,因此使用for-in無法發現。

apply屬性和call屬性都是用來在特定的作用域中調用函數,實際上等於設置函數體內this對象的值。

apply方法能劫持另外一個對象的方法,繼承另外一個對象的屬性。

首先apply()方法接收兩個參數:一個是在其中運行函數的作用域,另一個是參數數組。其中,第二個參數可以是Array的實例,也可以是arguments對象。

 function sum(num1,num2){
  return  num1+num2;
}
function callSum1(num1,num2){
   return  sum.apply(this,arguments);    //傳入arguments對象
}

function callSum2(num1,num2){
 return  sum.apply(this,[num1,num2]);   //傳入數組
}
alert(callSum1(10,10));  //20 
alert(callSum2(10,10));  //20

call方法與apply方法的作用相同。它們的區別僅僅在於接收參數的方式不同。對於call()而言,第一個參數是this值不變。變化的是其余參數都直接傳遞參數給函數。換句話說,在使用call方法時候,傳遞給函數的參數必須逐個列舉出來。如下面的例子:

function  sum(num1,num2){
  return  num1+num2;
}
function  callSum(num1,num2){
  return  sum.call(this,num1,num2);
}
alert(callSum(10,10));  //20

在使用call()方法的情況下,callSum()必須明確地傳入每一個參數。結果與使用apply()沒有什么不同。至於是使用apply還是使用call,完全取決於你哪種給函數傳遞的方式最方便。

事實上,傳遞參數並非apply與call真正的用武之地;它們真正強大的地方在於可以擴充函數賴以運行的作用域。

它們的使用作用與bind()一樣。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM