面向?qū)ο螅ㄎ澹?-四種調(diào)用模式call與apply

編程語(yǔ)言的幾個(gè)出發(fā)點(diǎn)

變量辜纲,基礎(chǔ)語(yǔ)法 ,函數(shù)
作用域 面向?qū)ο?/p>

1.函數(shù)的四種調(diào)用模式

  1. 函數(shù)模式
  2. 方法模式
  3. 構(gòu)造器模式
  4. 上下文模式

1.1函數(shù)模式

1 函數(shù)的定義方式

        1> 聲明式
        2> 表達(dá)式式
        3> Function
  1. 單獨(dú)獨(dú)立調(diào)用的就是函數(shù)
    1. 函數(shù)名( 參數(shù) )
    2. this 表示全局對(duì)象

注意:任何自調(diào)用函數(shù)都是函數(shù)模式
代碼演示:

function foo(){
    console.log(this);
}

foo();   //this指的是全局對(duì)象window

1.2 方法調(diào)用模式 method

方法本身就是函數(shù), 但是方法不是單獨(dú)獨(dú)立的調(diào)用, 而是通過(guò)一個(gè)對(duì)象引導(dǎo)調(diào)用.

obj.方法( 參數(shù) )

代碼演示:


var length = 10;
    function fn() {
        console.log( this.length );
    }
    var obj = {
        length: 5,
        method: function ( fn ) {
            fn();              //10
            arguments[ 0 ]();  //2
        }
    };
    obj.method( fn, 1 );

1.3 構(gòu)造器模式(構(gòu)造函數(shù)模式, 構(gòu)造方法模式)

使用 new 關(guān)鍵字引導(dǎo)

    -> 執(zhí)行步驟
        var p = new Person();
        new 是一個(gè)運(yùn)算符, 專門(mén)用來(lái)申請(qǐng)創(chuàng)建對(duì)象, 創(chuàng)建出來(lái)的對(duì)象傳遞給構(gòu)造函數(shù)的 this
        利用構(gòu)造函數(shù)對(duì)其初始化

        function Person () {
            this.name = 'jim',
            this.age = 19;
            this.gender = 'male';
        }
-> 返回值
    如果不寫(xiě) return 語(yǔ)句, 那么 構(gòu)造函數(shù) 默認(rèn)返回 this
    如果在構(gòu)造函數(shù)中寫(xiě)上 return 語(yǔ)句, 并緊跟基本類型( return num, return 1223 ). 則忽略返回類型. 
    如果在構(gòu)造函數(shù)中寫(xiě)上 return 語(yǔ)句, 并且緊跟引用類型, 那么構(gòu)造函數(shù)返回該引用類型數(shù)據(jù), 而忽略 this

注意:** 如果調(diào)用構(gòu)造函數(shù)的時(shí)候, 構(gòu)造函數(shù)沒(méi)有參數(shù), 圓括號(hào)是可以省略的**

1.4上下文調(diào)用模式

    1. 語(yǔ)法形式
      • 函數(shù)名.call( ... )
      • 函數(shù)名.apply( ... )

注意:這兩種形式功能完全一樣, 唯一不同的是參數(shù)的形式.

-> 帶有參數(shù)的函數(shù)如何實(shí)現(xiàn)上下文調(diào)用
        function foo ( num1, num2 ) {
            console.log( this );
            return num1 + num2;
        } 

        // 函數(shù)調(diào)用模式
        var res1 = foo( 123, 567 );

        // 方法調(diào)用
        var o = { name: 'jim' };
        o.func = foo;

        var res2 = o.func( 123, 567 );

使用 apply 進(jìn)行調(diào)用, 如果函數(shù)是帶有參數(shù)的. apply 的第一個(gè)參數(shù)要么是 null 要么是對(duì)象
如果是 null 就是函數(shù)調(diào)用, 如果是 對(duì)象就是 方法對(duì)象, 該對(duì)象就是宿主對(duì)象, 后面緊跟一個(gè)
數(shù)組參數(shù), 將函數(shù)的參數(shù)依次放在數(shù)組中.

        例如: 函數(shù)模式        foo( 123, 567 );
              apply         foo.apply( null, [ 123, 567 ] )

        如果有一個(gè)函數(shù)調(diào)用: func( '張三', 19, '男' ), 將其修改成 apply 模式
        func.apply( null, [ '張三', 19, '男'] )

        方法模式:           o.func( 123, 567 )
        apply               foo.apply( o, [ 123, 567 ] )

call 調(diào)用

在使用 apply 調(diào)用的時(shí)候, 函數(shù)參數(shù), 必須以數(shù)組的形式存在. 但是有些時(shí)候數(shù)組封裝比較復(fù)雜
所以引入 call 調(diào)用, call 調(diào)用與 apply 完全相同, 唯一不同是是參數(shù)不需要使用數(shù)組.

foo( 123, 567 );

foo.apply( null, [ 123, 567 ] );

foo.call( null, 123, 567 );

擴(kuò)展借用構(gòu)造函數(shù)繼承

 借用構(gòu)造方法實(shí)現(xiàn)繼承
    function Person ( name, age, gender ) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    function Student ( name, age, gender, course ) {

        Person.call( this, name, age, gender );

        this.course = course;
    }

    var p = new Student ( 'jim', 19, 'male', '前端' );

2.函數(shù)的 bind 方法

// 讓 t 包含函數(shù)體( 原來(lái) ), 同時(shí)還包含 對(duì)象 
    var t = document.getElementsByTagName.bind( document ), 
        arr = [];
    
    arr.push.apply( arr, t( 'p' ) );

    arr.push.apply( arr, t( 'div' ) );

t('p') 相當(dāng)于 document.getElementsByTagName('p');


3. Object.prototype 的成員

1) constructor
2) hasOwnProperty 判斷該屬性是否為自己提供
3) propertyIsEnumerable 判斷屬性是否可以枚舉
4) isPrototypeOf    判斷是否為原型對(duì)象
5) toString, toLocaleString, valueOf

4.getter 與 setter 的語(yǔ)法糖

語(yǔ)法糖: 為了方便開(kāi)發(fā)而給出的語(yǔ)法結(jié)構(gòu)

    var o = (function () {
        var num = 123;
        return {
            get_num: function () {
                return num;
            },
            set_num: function ( v ) {
                num = v;
            }
        };
    })();

    // 獲得數(shù)據(jù)
    o.get_num();            => o.num 形式

    // 設(shè)置
    o.set_num( 456 );       => o.num = 456 形式

    var o = (function () {
        var num = 123;
        return {
                
            // get 名字 () { 邏輯體 }
            get num () {
                return num;
            }

            // set 名字 ( v ) { 邏輯體 }
            set num ( v ) {
                num = v;
            }
        };
    })();
    

5.數(shù)組新增方法介紹

ES5 中引入的部分?jǐn)?shù)組方法

  1. forEach
  2. map
  3. filter
  4. some
  5. every
  6. indexOf
  7. lastIndexOf

演示代碼:

// 1 forEach
    // var arr = [ 'hello', ' js', {  }, function () {} ];
    // // 遍歷 數(shù)組
    // arr.forEach( function ( v, i ) {
    //  console.log( i + '=====' + v );
    // });


    // 2 map 映射
    // 語(yǔ)法:      數(shù)組.map( fn )
    // 返回一個(gè)數(shù)組, 數(shù)組的每一個(gè)元素就是 map 函數(shù)中的 fn 的返回值
    // var arr = [ 1, 2, 3, 4 ];

    // 數(shù)學(xué)中: x -> x * x
    // var a = arr.map(function ( v, i ) {
    //  return v * v;
    // });


    // 3 filter 就是篩選
    // 語(yǔ)法:     數(shù)組.filter( function ( v, i ) { return true/false })
    // var arr = [ 1, 2, 3, 4, 5, 6 ];
    // var a = arr.filter( function ( v ) { return v % 2 === 1; });


    // 4 some 判斷數(shù)組中至少有一個(gè)數(shù)據(jù)復(fù)合要求 就返回 true, 否則返回 false
    // var arr = [ '123', {}, function () {}, '123' ];
    // 判斷數(shù)組中至少有一個(gè)數(shù)數(shù)字
    // var isTrue = arr.some( function ( v ) { return typeof v === 'number'; } );

    // 5 every 必須滿足所有元素都復(fù)合要求才會(huì)返回 true
    // var arr = [ 1, 2, 3, 4, 5, '6' ];
    // var isTrue = arr.every( function ( v ) { return typeof v === 'number'; } );


    // 6 indexOf 在數(shù)組中查找元素, 如果含有該元素, 返回元素的需要( 索引 ), 否則返回 -1
    // var arr = [ 1, 2, 3, 4, 5 ];
    // var res = arr.indexOf( 4 );
    // console.log( res );

    // var arr = [ 1, 2, 3, 4, 5, 4, 5, 6 ];
    // var res = arr.indexOf( 4, 4 );
    // console.log( res );

    // 7 lastIndexOf 從右往左找
    // var arr = [ 1, 2, 3, 4, 5, 4, 5, 6 ];
    // var res = arr.lastIndexOf( 4 );
    // console.log( res );

動(dòng)態(tài)創(chuàng)建函數(shù)


var Person=new Function('name','console.log(name)');
var p1=new Person('dd');
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顶吮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埋市,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件命贴,死亡現(xiàn)場(chǎng)離奇詭異道宅,居然都是意外死亡食听,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)污茵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)樱报,“玉大人,你說(shuō)我怎么就攤上這事泞当〖8颍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵襟士,是天一觀的道長(zhǎng)笤受。 經(jīng)常有香客問(wèn)我,道長(zhǎng)敌蜂,這世上最難降的妖魔是什么箩兽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮章喉,結(jié)果婚禮上汗贫,老公的妹妹穿的比我還像新娘。我一直安慰自己秸脱,他們只是感情好落包,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著摊唇,像睡著了一般咐蝇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巷查,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天有序,我揣著相機(jī)與錄音,去河邊找鬼岛请。 笑死旭寿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的崇败。 我是一名探鬼主播盅称,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼通砍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼猿涨!你這毒婦竟也來(lái)了赌渣?” 一聲冷哼從身側(cè)響起皂林,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栖忠,沒(méi)想到半個(gè)月后裁蚁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體绪钥,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡松申,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年云芦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贸桶。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舅逸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出皇筛,到底是詐尸還是另有隱情琉历,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布水醋,位于F島的核電站旗笔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拄踪。R本人自食惡果不足惜蝇恶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惶桐。 院中可真熱鬧撮弧,春花似錦、人聲如沸姚糊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)救恨。三九已至贸辈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肠槽,已是汗流浹背擎淤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秸仙,地道東北人揉燃。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像筋栋,于是被迫代替她去往敵國(guó)和親炊汤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容