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()一樣。