摘要:構(gòu)造函數(shù)里的作用在的時(shí)候,所謂的作用域賦給新對(duì)象,就是使用了方法。如果我們不用,也可以實(shí)現(xiàn)指向我們想指向的對(duì)象構(gòu)造函數(shù)當(dāng)做普通函數(shù)使用,構(gòu)造函數(shù)當(dāng)做普通函數(shù)使用,這些變式其實(shí)都是在充分了解和的用法后,自然寫出來(lái)的。
這一期所書寫的目的并不是為了介紹創(chuàng)建對(duì)象的方法,在紅皮書里面,例子其實(shí)很清楚。在這篇文章中,想討論一下書中細(xì)節(jié),并沒(méi)有解釋太清楚的地方。
工廠模式//工廠模式書本「 function createPerson(name,age){ var obj=new Object(); obj.name=name; obj.age=age; obj.load=function(){ console.log(obj.name,obj.age); } return obj; } var toti=createPerson("toti",18); toti.load(); //」工廠模式書本
工廠模式的一些要點(diǎn):
解決:
創(chuàng)建多個(gè)相似對(duì)象問(wèn)題
傳參
缺點(diǎn):不能識(shí)別對(duì)象類型
優(yōu)化:一般使用對(duì)象字面量寫法,再返回
思考
對(duì)象暴露出來(lái),其實(shí)也可以用,但是賦值需要重復(fù)。
包在一個(gè)函數(shù)里面,傳參方便
這個(gè)模式做了什么?
創(chuàng)建一個(gè)Object實(shí)例對(duì)象
為實(shí)例obj添加屬性、方法
返回實(shí)例obj
相當(dāng)于使用了一個(gè)普通的函數(shù),去讓這個(gè)對(duì)象可以復(fù)用。
書中:「不能識(shí)別對(duì)象類型」如何理解?
我們的實(shí)例,當(dāng)我們?nèi)onsole.log(toti)的時(shí)候。但是工廠模式下,
我們?nèi)カ@取這個(gè)實(shí)例的時(shí)候,只能簡(jiǎn)單的判斷它是一個(gè)對(duì)象。這就是它一個(gè)缺點(diǎn),于是我們有了后面的構(gòu)造函數(shù)模式
使用對(duì)象字面量寫法優(yōu)化
//工廠模式對(duì)象字面量「 function createPerson(name,age){ var obj={ name:name, age:age, load:function(){ console.log(this.name,this.age); } } return obj; } var mary=createPerson("mary",18); mary.load(); //」工廠模式對(duì)象字面量
對(duì)象字面量注意問(wèn)題
this的用法
在obj對(duì)象里面,this.name&this.age指向obj的作用域的name&age
如果不使用this,則name和age,指向createPerson的作用域。
在本例中,使用this.name,name都可以,因?yàn)槭莻鲄?,所以createPerson和obj兩個(gè)作用域變量一樣
構(gòu)造函數(shù)模式//「 構(gòu)造函數(shù)模式;「 構(gòu)造函數(shù)當(dāng)做構(gòu)造函數(shù)使用,用new function Person(name,age){ this.name=name; this.age=age; this.load=function(){ console.log(this.name,this.age); } } var toti=new Person("toti",18); toti.load(); console.log(typeof toti); // 」構(gòu)造函數(shù)模式;」構(gòu)造函數(shù)當(dāng)做構(gòu)造函數(shù)使用,用new
發(fā)生了什么?
在解釋發(fā)生的事情前,我們要先詳細(xì)了解下new的作用。在紅皮書中,new的作用,解釋的的確很淺,簡(jiǎn)單幾行字,不細(xì)讀,很難理清其中的邏輯。
NEW的作用
紅皮書中是這樣解釋的:
創(chuàng)建一個(gè)新對(duì)象
將構(gòu)造函數(shù)的作用域賦值給新對(duì)象
執(zhí)行構(gòu)造函數(shù)中的代碼
返回新對(duì)象
這幾行文字,一開始我也以為我讀懂了,但是它實(shí)在沒(méi)有很好地給讀者說(shuō)明白new到底怎么用的。
在這里,我引用一個(gè)我提問(wèn)中的網(wǎng)友的回答,下面是來(lái)自wei0613的回答:
function CO(){ this.p = “I’m in constructed object”; this.alertP = function(){ alert(this.p); } } var o2 = new CO();
var obj ={}; obj.__proto__ = CO.prototype; CO.call(obj); return obj;
他用代碼形式給我們講解了其中發(fā)生了什么事:
new先創(chuàng)建了一個(gè)對(duì)象obj
然后CO函數(shù)的原型賦值給對(duì)象obj的原型
CO函數(shù)再使用call/apply方法把作用域賦給obj
到這一步才執(zhí)行構(gòu)造函數(shù)Co里面的代碼?。?!
返回obj對(duì)象
大家可能第一眼,并不能發(fā)現(xiàn)我這里的邏輯和紅皮書的邏輯有什么區(qū)別。首先,紅皮書的邏輯中,很明顯少了原型創(chuàng)建發(fā)生在哪一步,如果這里不清楚,會(huì)影響大家理解接下來(lái)原型模式和動(dòng)態(tài)原型模式的理解;其次,第4步是最重要的,也就是構(gòu)造函數(shù)的代碼執(zhí)行,是發(fā)生在第4步,call的使用和原型鏈的形成都發(fā)生在之前。如果我們僅僅只有一個(gè)大概概念,當(dāng)我們遇到對(duì)象字面量重寫的時(shí)候,我們很可能發(fā)現(xiàn)我們代碼寫得都沒(méi)有問(wèn)題,但是就是出bug的情況。這個(gè)工作流邏輯大家一定要清楚。
構(gòu)造函數(shù)里this的作用
在new的時(shí)候,所謂的作用域賦給新對(duì)象,就是使用了call/apply方法。
Person.apply(obj,arguments);
this就指向了obj對(duì)象
把this的屬性方法一個(gè)個(gè)添加到obj對(duì)象里面
其他不是this的屬性和方法,都會(huì)被忽略,比如:
function Person(name, age,job){ this.name=name; this.age=age; this.load=function(){ console.log(this.name,this.age); } var job=job; }
job就不會(huì)被寫入obj對(duì)象里面
注意,當(dāng)我們new Person()的時(shí)候,是把函數(shù)當(dāng)作構(gòu)造函數(shù)使用的,但是它也是函數(shù),可以像普通函數(shù)一樣使用
//「 構(gòu)造函數(shù)當(dāng)做普通函數(shù)使用,不用new function Person(name,age){ this.name=name; this.age=age; this.load=function(){ console.log(this.name,this.age); } } var mike=Person("mike",18); //mike.load();會(huì)報(bào)錯(cuò),Person沒(méi)有對(duì)象返回 window.load(); // 」構(gòu)造函數(shù)當(dāng)做普通函數(shù)使用,不用new
直接使用函數(shù),等于在當(dāng)前作用域下運(yùn)行。在這種情況下,我們則會(huì)把this指向這個(gè)環(huán)境的作用域,在這里是window。我們使用mike.load()會(huì)報(bào)錯(cuò),因?yàn)閷傩院头椒ú](méi)有添加到mike這個(gè)對(duì)象中,而是添加到了window這個(gè)對(duì)象。
如果我們不用new,也可以實(shí)現(xiàn)this指向我們想指向的對(duì)象
//「 構(gòu)造函數(shù)當(dāng)做普通函數(shù)使用,call,apply function Person(name,age){ this.name=name; this.age=age; this.load=function(){ console.log(this.name,this.age); } } var obj={}; Person.call(obj,"mike",18); obj.load(); // 」構(gòu)造函數(shù)當(dāng)做普通函數(shù)使用,call,apply
這些變式其實(shí)都是在充分了解new和this的用法后,自然寫出來(lái)的。通過(guò)些變式,大家可以更好理解它們的用法。
相比工廠模式,構(gòu)造函數(shù)模式的優(yōu)缺點(diǎn)及思考
當(dāng)我們console.log(toti):
我們回顧工廠模式下,是:
所以構(gòu)造函數(shù)模式在這里比工廠模式更好,看到這里大家應(yīng)該明白書中:「不能識(shí)別對(duì)象類型」的問(wèn)題了。
構(gòu)造函數(shù)模式要點(diǎn)
解決:可以識(shí)別為一種特定的類型
缺點(diǎn):構(gòu)造函數(shù)的每個(gè)方法都被實(shí)例了一遍
思考:
構(gòu)造函數(shù)開頭大寫,其他函數(shù)開頭小寫
不使用new,相當(dāng)于普通函數(shù)使用,this指向window,為window添加變量和方法
也可以使用call和apply來(lái)為第三方作用域添加
重點(diǎn):
new
this
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82317.html
摘要:年的區(qū)塊鏈牛市已經(jīng)過(guò)去了,目前看來(lái),年會(huì)是一個(gè)大熊市,投資抄幣估計(jì)也撈不著什么。熊市囤技術(shù),其實(shí)是技術(shù)人員很好的選擇。三期同學(xué)討論積累資料的地址等風(fēng)來(lái)區(qū)塊鏈熊市,技術(shù)人就要做技術(shù)投資。 2017 年的區(qū)塊鏈牛市已經(jīng)過(guò)去了,目前看來(lái),2018 年會(huì)是一個(gè)大熊市,投資抄幣估計(jì)也撈不著什么。熊市只能囤囤幣,囤囤技術(shù),只能等下一輪風(fēng)起了。熊市囤技術(shù),其實(shí)是技術(shù)人員很好的選擇。等區(qū)塊鏈牛市來(lái)了,...
摘要:理解白皮書第部分原文鏈接哦不,白皮書加密貨幣區(qū)塊鏈?zhǔn)澜缦矏?ài)白皮書,也不例外。要理解的工作原理,最好一步一步地學(xué)習(xí)白皮書。從開始,白皮書中明確提到了三個(gè)實(shí)現(xiàn)。白皮書指出小值等于或小于直接存儲(chǔ)在上。 理解 IPFS 白皮書 第 1 部分 原文鏈接:https://decentralized.blog/un... 哦不,白皮書! 加密貨幣 / 區(qū)塊鏈?zhǔn)澜缦矏?ài)白皮書,IPFS 也不例外。 它起...
摘要:每周前端開源推薦第三期是一個(gè)用很炫的動(dòng)畫來(lái)展示數(shù)字的庫(kù),效果非常贊。把放在第一位是因?yàn)楝F(xiàn)在毫無(wú)疑問(wèn)是最流行的實(shí)時(shí)框架。如此巨額的投資保證了開源小組高質(zhì)的開發(fā),目前版本號(hào)是。目前貌似主要面向請(qǐng)應(yīng)用。 每周前端開源推薦第三期 HubSpot / odometer Beautiful CSS3 Number Transitions #hubspot-open-source h...
摘要:每周前端開源推薦第三期是一個(gè)用很炫的動(dòng)畫來(lái)展示數(shù)字的庫(kù),效果非常贊。把放在第一位是因?yàn)楝F(xiàn)在毫無(wú)疑問(wèn)是最流行的實(shí)時(shí)框架。如此巨額的投資保證了開源小組高質(zhì)的開發(fā),目前版本號(hào)是。目前貌似主要面向請(qǐng)應(yīng)用。 每周前端開源推薦第三期 HubSpot / odometer Beautiful CSS3 Number Transitions #hubspot-open-source h...
摘要:每周前端開源推薦第三期是一個(gè)用很炫的動(dòng)畫來(lái)展示數(shù)字的庫(kù),效果非常贊。把放在第一位是因?yàn)楝F(xiàn)在毫無(wú)疑問(wèn)是最流行的實(shí)時(shí)框架。如此巨額的投資保證了開源小組高質(zhì)的開發(fā),目前版本號(hào)是。目前貌似主要面向請(qǐng)應(yīng)用。 每周前端開源推薦第三期 HubSpot / odometer Beautiful CSS3 Number Transitions #hubspot-open-source h...
閱讀 3070·2021-09-22 15:59
閱讀 1323·2021-08-30 09:46
閱讀 2284·2019-08-30 15:54
閱讀 2023·2019-08-26 12:15
閱讀 2551·2019-08-26 12:09
閱讀 1348·2019-08-26 11:57
閱讀 3345·2019-08-23 17:11
閱讀 1895·2019-08-23 15:59