成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript:萬(wàn)惡的this拿命來(lái)(二)

fox_soyoung / 710人閱讀

摘要:構(gòu)造函數(shù)對(duì)于被實(shí)例化的,我們稱之為構(gòu)造函數(shù),及使用關(guān)鍵字調(diào)用的,對(duì)于它們來(lái)說(shuō),會(huì)被改變,指向?qū)嵗?。上栗子全局賦上屬性通過(guò)關(guān)鍵字創(chuàng)建實(shí)例,改變函數(shù)內(nèi)部指向注解通過(guò)這個(gè)栗子,我們可以看出,通過(guò)創(chuàng)建構(gòu)造函數(shù)的實(shí)例,使得的指向改變,指向了實(shí)例本身。

用栗子說(shuō)this
  

Bug年年有,今年特別多
對(duì)于JavaScript這么靈活的語(yǔ)言來(lái)說(shuō),少了this怎么活!

function 函數(shù) this
對(duì)于沒(méi)有實(shí)例化的function,我們稱之為函數(shù),即沒(méi)有用new關(guān)鍵字調(diào)用的函數(shù),對(duì)它們來(lái)說(shuō),this一律指代全局。

上栗子

var position = "outer";               

function test(){
    position = "inner";           
}

console.log(this.position);     // outer   
test();
console.log(this.position);     // inner

原因:內(nèi)部未用var聲明發(fā)生“變量提升”,污染全局變量。
構(gòu)造函數(shù) this
對(duì)于被實(shí)例化的function,我們稱之為構(gòu)造函數(shù),及使用new關(guān)鍵字調(diào)用的function,對(duì)于它們來(lái)說(shuō),this會(huì)被改變,指向?qū)嵗?

上栗子

var name = "person";               // 全局this賦上屬性name

function Person(name){
    this.name = name;

    this.say = function () {
        console.log("My name is "+this.name);
    }

    this.show = function () {
        console.log(this);
    }
}


var william = new Person("william"); //通過(guò)new關(guān)鍵字創(chuàng)建實(shí)例,改變函數(shù)內(nèi)部this指向

console.log(this.name);          //person

william.say();                   //My name is william

william.show();                  //Person {name: "william", say: ...


注解:通過(guò)這個(gè)栗子,我們可以看出,通過(guò)創(chuàng)建構(gòu)造函數(shù)的實(shí)例,使得this的指向改變,指向了實(shí)例本身。
原型對(duì)象 this
每一個(gè)函數(shù)對(duì)象在創(chuàng)建的時(shí)候,都會(huì)自動(dòng)添加一個(gè)prototype屬性,這個(gè)prototype其實(shí)是一個(gè)指針,指向這個(gè)函數(shù)的原型對(duì)象。

你可以通過(guò)prototype指針給這個(gè)函數(shù)對(duì)象的原型對(duì)象添加屬性,在實(shí)例化函數(shù)對(duì)象后,可以通過(guò)this來(lái)訪問(wèn)原型對(duì)象上的屬性。

上栗子

function Person(){
    console.log(this.name);
}

Person.prototype.name = "william";    //給原型對(duì)象上賦name屬性

var person = new Person();            // 通過(guò)this.name訪問(wèn)原型對(duì)象上的屬性,打印 "william"

這還不夠,咱們?yōu)楹瘮?shù)對(duì)象直接添加同名,而不在原型對(duì)象上添加

function Person(){
    this.name = "Jack";
    console.log(this.name);
}

Person.prototype.name = "william";

var person = new Person();           // 打印 "Jack"

這里有一個(gè)值得注意的地方:

  

當(dāng)你構(gòu)造函數(shù)中存在和原型對(duì)象同名屬性方法時(shí),原型對(duì)象中的屬性或方法會(huì)被隱藏,你只會(huì)訪問(wèn)到構(gòu)造函數(shù)中的屬性或方法`

Object.create this
通過(guò)Object.create創(chuàng)建函數(shù)對(duì)象實(shí)例,而不使用new關(guān)鍵字,也就是說(shuō)它不會(huì)去調(diào)用構(gòu)造函數(shù)

上栗子

function Person(name){    
    this.name = name;               
    this.showName = function () {
        console.log(this.name + " in constructor");
    }
} //在構(gòu)造函數(shù)中的屬性和方法,均同名

Person.prototype.name = "jack";
Person.prototype.showName = function () {
    console.log(this.name + " in prototype");
};
  //在原型對(duì)象中的屬性和方法,均同名

var william  = new Person("william");
var jack = Object.create(Person.prototype);

william.showName();  // william in constructor

jack.showName();     // jack in prototype


注解:
 - 使用new關(guān)鍵字創(chuàng)造的實(shí)例調(diào)用了構(gòu)造函數(shù)的屬性和方法
 - 使用Object.create創(chuàng)造的實(shí)例調(diào)用了原型對(duì)象的屬性和方法
原型鏈 this
原型鏈用于實(shí)現(xiàn)繼承,當(dāng)沒(méi)有找到需要屬性或方法時(shí),會(huì)順著原型鏈向上繼續(xù)尋找。

上栗子

function Father(){
    this.name = "father";
}                              //可以看做"父類"
Father.prototype.showName = function () {
    console.log(this.name);
};

function Son(){
    this.name = "son";
}                              //可以看做"子類"
Son.prototype = new Father();  //這步是關(guān)鍵!

var mike = new Son();
mike.showName();               // son

注解:
 - 首先要強(qiáng)調(diào)的是JavaScript中沒(méi)有"父類","子類","繼承"這樣的東西,我們只是通過(guò)原型鏈來(lái)實(shí)現(xiàn)這樣的設(shè)計(jì)模式。

 - 通過(guò)這一步
     Son.prototype = new Father();
   我們將"子類"的prototype指針指向了"父類"函數(shù)對(duì)象
設(shè)計(jì)模式:繼承
 為什么這樣就能實(shí)現(xiàn)繼承呢?

 首先要想明白為什么實(shí)例能訪問(wèn)構(gòu)造函數(shù)的原型對(duì)象

 在JavaScript中,有一個(gè)內(nèi)部的屬性,在火狐,谷歌瀏覽器中,將這個(gè)內(nèi)部屬性暴露了出來(lái),就是它 __proto__

上栗子(瀏覽器中)

mike.__proto__ // Father {name: "father", showName: function}    
Son.prototype  //Father {name: "father", showName: function}

mike.__proto__ === Son.prototype  // true

通過(guò)這個(gè)內(nèi)部屬性,我們可以訪問(wèn)到實(shí)例的構(gòu)造函數(shù)的原型對(duì)象

再來(lái)一枚(瀏覽器中)

mike.__proto__.__proto__      //Father {showName: function}
Father.prototype              //Father {showName: function}

mike.__proto__.__proto__ === Father.prototype  // true

我們現(xiàn)在通過(guò)__proto__訪問(wèn)到了"父類"的原型對(duì)象!
繼承得以實(shí)現(xiàn)!

補(bǔ)充一句:

我們可以訪問(wèn)到Son的name屬性的值,卻訪問(wèn)不到Father的name屬性的值,是因?yàn)? - mike是Son的實(shí)例(實(shí)例能做什么...?)
 - Father中的name沒(méi)有對(duì)外開(kāi)放,可以看做是私有屬性
總結(jié)

主要探討了
- function作為函數(shù)、構(gòu)造函數(shù)、原型對(duì)象時(shí),this的指代情況
- 擴(kuò)展了另一種實(shí)例化方式Object.create
- 細(xì)說(shuō)了原型鏈原理和實(shí)現(xiàn),模擬了繼承的設(shè)計(jì)模式

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91494.html

相關(guān)文章

  • JavaScript:萬(wàn)惡this命來(lái)(一)

    摘要:在腳本中,默認(rèn)指向一個(gè)空對(duì)象,并不是指向,也不是指向。舉個(gè)栗子,在函數(shù)執(zhí)行后,覆蓋原先的值我們?cè)谕獠慷x了一個(gè)名為的全局變量,它會(huì)被默認(rèn)添加到全局的屬性上。總結(jié)在不同的執(zhí)行環(huán)境中的默認(rèn)指代通過(guò)省略聲明變量導(dǎo)致變量提升現(xiàn)象的發(fā)生及預(yù)防 侃侃JavaScript中的this this為何如此多變? this總是跟它的執(zhí)行上下文有關(guān),而在JavaScript總會(huì)有開(kāi)辟新的執(zhí)行上...

    loostudy 評(píng)論0 收藏0
  • JavaScript:萬(wàn)惡 this 命來(lái)(三)

    摘要:閉包執(zhí)行上下文決定了變量作用域而閉包,它其實(shí)是一種決策,是一種模式,讓我們可以靈活的改變變量作用域。所以,在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁。只要咱們弄明白閉包,其中的自然跑不掉。 閉包 this 執(zhí)行上下文決定了變量作用域 而閉包,它其實(shí)是一種決策,是一種模式,讓我們可以靈活的改變變量作用域。 按慣例,上栗子 var global = glo...

    Cympros 評(píng)論0 收藏0
  • 設(shè)計(jì)模式之狀態(tài)模式

    摘要:為了實(shí)現(xiàn)這個(gè)正義偷笑又合理的訴求,你得先學(xué)會(huì)今天要介紹的設(shè)計(jì)模式,因?yàn)槟銈児镜倪@個(gè)流程可能就是用今天這個(gè)模式設(shè)計(jì)的。狀態(tài)模式對(duì)開(kāi)閉原則的支持并不太好,新增狀態(tài)時(shí),不僅得增加狀態(tài)類,還得修改原來(lái)已經(jīng)有的狀態(tài),讓之前的狀態(tài)切換到新增的狀態(tài)。一、定義你是否經(jīng)常請(qǐng)(偷)假(懶)?是不是對(duì)公司萬(wàn)惡的請(qǐng)假申請(qǐng)流程深惡痛絕。有沒(méi)有想過(guò)偷偷改造這個(gè)萬(wàn)惡的系統(tǒng),從 申請(qǐng)->項(xiàng)目經(jīng)理審批->部門審批->老板審...

    zhangke3016 評(píng)論0 收藏0
  • 不用 Spring Security 可否?試試這個(gè)小而美安全框架

    摘要:寫在前面在一款應(yīng)用的整個(gè)生命周期,我們都會(huì)談及該應(yīng)用的數(shù)據(jù)安全問(wèn)題。用戶的合法性與數(shù)據(jù)的可見(jiàn)性是數(shù)據(jù)安全中非常重要的一部分。 寫在前面 在一款應(yīng)用的整個(gè)生命周期,我們都會(huì)談及該應(yīng)用的數(shù)據(jù)安全問(wèn)題。用戶的合法性與數(shù)據(jù)的可見(jiàn)性是數(shù)據(jù)安全中非常重要的一部分。但是,一方面,不同的應(yīng)用對(duì)于數(shù)據(jù)的合法性和可見(jiàn)性要求的維度與粒度都有所區(qū)別;另一方面,以當(dāng)前微服務(wù)、多服務(wù)的架構(gòu)方式,如何共享Sessi...

    toddmark 評(píng)論0 收藏0
  • 異步流程控制:7 行代碼學(xué)會(huì) co 模塊

    摘要:而在中是迭代器生成器,被創(chuàng)造性的拿來(lái)做異步流程控制了。當(dāng)執(zhí)行的時(shí)候,并不執(zhí)行函數(shù)體,而是返回一個(gè)迭代器。行代碼再看看文章開(kāi)頭的行代碼首先生成一個(gè)迭代器,然后執(zhí)行一遍,得到的是一個(gè)對(duì)象,里面再執(zhí)行。 廣告招人:阿里巴巴招前端,在這里你可以享受大公司的福利和技術(shù)體系,也有小團(tuán)隊(duì)的挑戰(zhàn)和成長(zhǎng)空間。聯(lián)系: qingguang.meiqg at alibaba-inc.com 首先請(qǐng)?jiān)徫业臉?biāo)題...

    tinna 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<