JS Call()與Apply()

JS Call()與Apply()

ECMAScript規範給所有函數都定義了Call()與apply()兩個方法,call與apply的第一個參數都是需要調用的函數對象,在函數體內這個參數就是this的值,剩餘的參數是需要傳遞給函數的值,call與apply的不同就是call傳的值可以是任意的,而apply傳的剩餘值必須爲數組。

例如:function add(a, b) { return a + b; }

function sub(a, b) { return a - b; }

/*apply用法

* var a1 = sub.apply(add, [4, 2]);

*var a2= add.apply(sub, [4, 2]);  

*/

var a1 = sub.call(add, 4, 2);

var a2= add.call(sub, 4, 2);

輸出:a1=2  a2=6

 

感覺還是有意未盡,更有意思的還在下面

js總是認爲他是萬能的,既然高級語言會繼承,我js也不能示弱:JS模仿繼承

  function fun1() {

            this.a = 123;

        this.add = function () { return  this.a }

        }

        function fun2() {

            this.a = 456;

        }

        var f1=new fun1()

        var f2=new fun2()

        var a = f1.add.call(f2);  // a輸出的是456

這裏就是把啊f1的方法拿給f2來使用,f2便可以使用f1中所有的方法,這不正是高級語言中繼承的概念嘍。當然根據綜上可擴展出多繼承,使用多個call便可以實現多繼承

   function fun1() {

 

            this.add = function () { return this.a }

        }

        function fun2() {

   

            this.sub = function () { return this.a-this.b }

        }

        function fun3() {

            this.a = 10;

            this.b = 2;

             fun1.call(this);

            fun2.call(this);

        }

        var f3 = new fun3()

        alert(f3.add());

        alert(f3.sub());如此,想要繼承誰就可以繼承誰,我js天下無敵 O(∩_∩)O哈哈~

來源:http://www.cnblogs.com/itstone/archive/2012/07/23/call.html


補充一點:call(),apply(),修改作用域鏈

funtion a(){

this.name = "a";

}

a();

name值就是window中的name

var divObj = $("#example");

a.call(divObj);  

name值就是divObj中的name



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章