JS面向對象函數的四種調用模式

在 js 中,不管是函數, 仍是方法, 仍是事件, 仍是構造器...這些東西的本質都是函數,其中的區別只是所處的位置不一樣。根據函數內部this的指向不一樣,能夠將函數的調用模式分紅4種:函數模式、方法模式、構造器模式和上下文模式等四種不一樣的調用模式。數組

解決方法:
首先先來分析this指向問題:瀏覽器

一、任何函數都有屬於本身的thisapp

二、this的指向和函數的調用模式相關,意味着this的指向在函數聲明的時候肯定不了。而後分析this指向的思路:函數

一、this是屬於哪一個函數的this

二、這個函數的調用模式是哪一種對象

四種調用模式事件

一、函數模式字符串

特徵:簡單的函數調用,函數名前面沒有任何引導內容。變量

this 的含義: 在 函數中 this 表示全局對象, 在瀏覽器中this表示window。
注:任何自調用函數都是函數模式
二、方法模式
特徵: 方法必定是依附於一個對象,將函數賦值給對象的一個屬性,那麼就成爲了方法。構造函數

this的含義:這個依附的對象
注:arguments 這種僞數組, 或者 [] 數組這樣的對象中, 這樣調用函數也是方法調用, this 會只指向對象。
三、構造器模式(構造函數模式,構造方法模式)
特徵:
(1)、使用 new 引導構造函數, 建立了一個實例對象

(2)、在建立對象的同時, 將this指向這個剛剛建立的對象

(3)、在構造函數中, 不須要 return , 會默認的 return this

分析:

因爲構造函數只是給 this 添加成員, 而方法也能夠完成這個操做,對與 this 來講, 構造函數和方法沒有本質區別

關於return的補充:

在構造函數中,普通狀況,能夠理解爲構造函數已經默認進行了return this,添加在後面的都不會執行

若是手動的添加 return ,就至關於 return this.

若是手動的添加 return 基本類型(字符串, 數字, 布爾), 無效, 仍是 return this

若是手動的添加 return null 或 return undefined, 無效, 仍是 return this

特殊狀況, return對象, 最終返回對象

手動添加return對象類型,那麼原來建立的this會被丟掉,返回 return 後面的對象

四、上下文調用模式

特徵:上下文調用模式也叫方法借用模式,分爲apply與call,上下文 就是環境, 就是自定義設置this的含義

語法:

函數名.apply(對象,[參數]);

函數名.call(對象,參數);

描述:

函數名就是表示的函數自己, 使用函數進行調用的時候默認 this 是全局變量

函數名也能夠是方法提供, 使用方法調用的時候, this 是指當前對象.

使用apply進行調用後, 不管是函數,仍是方法都無效了。咱們的 this, 由apply的第一個參數決定

注意:

若是函數或方法中沒有 this 的操做, 那麼不管什麼調用其實都同樣.

若是是函數調用foo(),那麼有點像foo.apply(window).

若是是方法調用o.method(),那麼有點像o.method.apply(o).

不管是call仍是apply在沒有後面的參數的狀況下(函數無參數,方法無參數)是徹底同樣的。

第一個參數的使用也是有規則的

若是傳入的是一個對象, 那麼就至關於設置該函數中的 this 爲參數

若是不傳入參數, 或傳入null、 undefiend 等, 那麼至關於this默認爲 window。

相關文章
相關標籤/搜索