this

this

this在面向對象編程過程當中非常重要,它的值取決於挪用情勢

在js中一共有四種挪用情勢:_要領挪用情勢、函數挪用情勢、組織器挪用函數和apply挪用情勢_。這四種情勢在初始化參數this上是存在着差別的。

要領挪用情勢

當函數被保存為對象的一個屬性,我們稱之為它的一個要領。

要領挪用情勢定義:挪用表達式包括一個提取屬性的行動(即包括一個.點表達式或許[]下標表達式),那末它就是看成一個要領來挪用。

看個簡樸的例子:

var name = "window";   
var xiaoming = {
    name: "xiaoming",
    lastname:'wang',
    saylastname:function(){
        console.log(this.lastname)
    }
};
console.log(xiaoming.saylastname()); //wang

要領是能夠運用this接見自身所屬的對象。this對對象的綁定是發作在挪用的時刻!(強調)是發作挪用的時刻。

如許經由過程this獲得他們所屬對象的上下文的要領也稱之為大眾要領。

函數挪用情勢

函數挪用情勢定義:當一個函數並不是一個對象的屬性時,那末它就是被看成一個函數來挪用的。以此情勢挪用函數時,this會被綁定到全局變量,也就是window對象。須要⚠️的是,在嚴厲情勢下,this的值為undefined。

連續上個情勢的例子:

var a = xiaoming.saylastname;
a();  //window

這個例子最好的申明:函數挪用並不是一個對象的屬性,就被看成一個函數來挪用。

組織器函數

組織器挪用情勢定義:假如建立的目標就是i 願望連繫new關鍵字前綴來挪用,那它就被稱為組織器函數。

假如在一個函數前面帶上new來挪用,那末就會建立一個鏈接到該函數的prototype成員的新對象,同時也會被綁定到哪一個欣對象上。

看這個例子:

var Person = function(Name){
        this.name = Name;
    };
//給person的一切對象供應一個大眾要領
Person.prototype.say = function(){
    return this.name;
};
//組織一個person實例
var xiaoming = new Person('xiaoming');  
console.log(xiaoming.say()); //xiaoming

在組織區函數中,通常會以大寫商定,如許它們會保存在以大寫花樣定名的變量中。如許的商定會自滿越發輕易辨別這是組織器函數變量。

⚠️ 固然如許的組織器函數情勢我們並不經常使用。以後我也會引見更好的替換體式格局。

apply挪用情勢

apply挪用情勢定義:函數能夠具有要領。apply要領讓我們構建一個參數數組傳遞給挪用函數,同時它也許可我們挑選this的值。

簡樸的說就時綁定this指向的對象。

apply能夠吸收2個參數,參數1:要綁定給this的值;參數2:數組參數。

看兩個例子:

var add = function(num1,num2){
    return num1 +num2;
}
var arr = [4,5];
var sum = add.apply(null,arr);
console.log(sum); //9

var xiaohong = {
    name:'xiaohong'
}
var xiaohongname = Person.prototype.say.apply(xiaohong);
console.log(xiaohongname); //xiaohong

第一個例子:是最典範的aplly要領的運用。

第二個例子中自身小紅對象沒有say要領,然則我們能夠經由過程apply要領將say要領傳遞給挪用對象,也能夠說綁定給指定的對象,而this也指向這個對象。

總結

所以說我們應當緊緊記着this的值取決於挪用的情勢。如許才會讓我們相識初始化參數this存在的差別。

    原文作者:哈哈洽洽
    原文地址: https://segmentfault.com/a/1190000014849940
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞