摘要:構(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
function 函數(shù) thisBug年年有,今年特別多
對(duì)于JavaScript這么靈活的語(yǔ)言來(lái)說(shuō),少了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è)值得注意的地方:
Object.create this當(dāng)你構(gòu)造函數(shù)中存在和原型對(duì)象中同名的屬性或方法時(shí),原型對(duì)象中的屬性或方法會(huì)被隱藏,你只會(huì)訪問(wèn)到構(gòu)造函數(shù)中的屬性或方法`
通過(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
摘要:在腳本中,默認(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í)行上...
摘要:閉包執(zhí)行上下文決定了變量作用域而閉包,它其實(shí)是一種決策,是一種模式,讓我們可以靈活的改變變量作用域。所以,在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁。只要咱們弄明白閉包,其中的自然跑不掉。 閉包 this 執(zhí)行上下文決定了變量作用域 而閉包,它其實(shí)是一種決策,是一種模式,讓我們可以靈活的改變變量作用域。 按慣例,上栗子 var global = glo...
摘要:為了實(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)理審批->部門審批->老板審...
摘要:寫在前面在一款應(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...
摘要:而在中是迭代器生成器,被創(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)題...
閱讀 3781·2021-08-30 09:47
閱讀 3718·2019-08-30 15:56
閱讀 684·2019-08-30 14:18
閱讀 704·2019-08-29 16:17
閱讀 2071·2019-08-29 11:07
閱讀 649·2019-08-26 13:53
閱讀 3456·2019-08-26 10:26
閱讀 2502·2019-08-23 18:30