javascript - js中單例模式疑惑
問題描述
以下代碼
function Universe() { // 緩存的實(shí)例 var instance = this; // 其它內(nèi)容 this.start_time = 0; this.bang = 'Big'; // 重寫構(gòu)造函數(shù) Universe = function () {return instance; };}// 測(cè)試var uni = new Universe();var uni2 = new Universe();uni.bang = '123';console.log(uni === uni2); // trueconsole.log(uni2.bang); // 123
點(diǎn)擊查看原文
問題:
new Universe()的過程是:var o = {};Universe.call(o);//這一步是將Universe中this對(duì)應(yīng)的屬性賦值給o;o.__proto__ = Universe.prototype;//將Universe原型上的方法賦值到o的__proto__屬性上;
那么 var instance = this;中,this是不是指的是不同的對(duì)象o?那么重寫構(gòu)造函數(shù)后,返回的instance不就是不同的對(duì)象嗎?為什么最后能相等
問題解答
回答1:因?yàn)橹貙懥藰?gòu)造函數(shù)后, 返回一個(gè)對(duì)象, 這個(gè)對(duì)象會(huì)覆蓋你 用new 構(gòu)造函數(shù)生成的那個(gè)對(duì)象,不知道我有沒有說清楚
回答2:@mpccc 說的對(duì)。
如果構(gòu)造函數(shù)返回一個(gè)對(duì)象,那 new 出來的就是這個(gè)對(duì)象啦。
可以看看秘密花園中的構(gòu)造函數(shù)這一段
回答3:我也是新手,嘗試解答一下,要是錯(cuò)了可別怪我
第一 this是不是指的是不同的對(duì)象 在第一次調(diào)用構(gòu)造函數(shù)的時(shí)候 產(chǎn)生一個(gè)空的對(duì)象 并且函數(shù)內(nèi)部的this指向了這個(gè)空對(duì)象,接著執(zhí)行代碼,最后返回這個(gè)對(duì)象 也就是uni。
而在第二次調(diào)用的時(shí)候由于第一次函數(shù)的改寫,產(chǎn)生了一個(gè)閉包,這個(gè)閉包的內(nèi)部的instance正好指向了第一次調(diào)用時(shí)的產(chǎn)生的對(duì)象uni,當(dāng)?shù)诙螆?zhí)行new Universe()的時(shí)候你執(zhí)行的是一個(gè)閉包,也會(huì)產(chǎn)生一個(gè)空的對(duì)象,但那個(gè)對(duì)象并沒有用到它,反而是直接返回了閉包內(nèi)部的instance也就是uni。
所以u(píng)ni2 === uni.
回答4:偏個(gè)題,這樣寫單例模式有點(diǎn)多余,要?jiǎng)?chuàng)建唯一的對(duì)象不用非得造個(gè)構(gòu)造函數(shù)
var single = function(fn){ var instance; return function(){ return instance || (instance = fn .apply(this, arguments)); } }; 回答5:
不是注釋寫了嗎,重寫了構(gòu)造函數(shù)啊,你new了一次之后再new就沒有var instance = this;這行代碼了,instance自然就不變了
//簡(jiǎn)單打印一下就知道了console.log(Universe)var uni = new Universe()console.log(Universe)回答6:
首次執(zhí)行new Universe()的時(shí)候,確實(shí)產(chǎn)生了一個(gè)新的this,并且將Universe構(gòu)造函數(shù)改寫了,之后再次調(diào)用這個(gè)new Universe()的時(shí)候,就只會(huì)return instance了,不會(huì)產(chǎn)生新的對(duì)象了。
相關(guān)文章:
1. android - Windows系統(tǒng)下運(yùn)行react-native App時(shí),報(bào)下面的錯(cuò)誤?2. python - Django分頁和查詢參數(shù)的問題3. 求大神幫我看看是哪里寫錯(cuò)了 感謝細(xì)心解答4. MySQL客戶端吃掉了SQL注解?5. 數(shù)據(jù)庫 - MySQL 單表500W+數(shù)據(jù),查詢超時(shí),如何優(yōu)化呢?6. php自學(xué)從哪里開始?7. mysql - AttributeError: ’module’ object has no attribute ’MatchType’8. 網(wǎng)頁爬蟲 - python爬蟲翻頁問題,請(qǐng)問各位大神我這段代碼怎樣翻頁,還有價(jià)格要登陸后才能看到,應(yīng)該怎么解決9. phpstady在win10上運(yùn)行10. javascript - 圖片能在網(wǎng)站顯示,但控制臺(tái)仍舊報(bào)錯(cuò)403 (Forbidden)
