javascript - js中單例模式疑惑
問題描述
以下代碼
function Universe() { // 緩存的實例 var instance = this; // 其它內容 this.start_time = 0; this.bang = 'Big'; // 重寫構造函數 Universe = function () {return instance; };}// 測試var uni = new Universe();var uni2 = new Universe();uni.bang = '123';console.log(uni === uni2); // trueconsole.log(uni2.bang); // 123
點擊查看原文
問題:
new Universe()的過程是:var o = {};Universe.call(o);//這一步是將Universe中this對應的屬性賦值給o;o.__proto__ = Universe.prototype;//將Universe原型上的方法賦值到o的__proto__屬性上;
那么 var instance = this;中,this是不是指的是不同的對象o?那么重寫構造函數后,返回的instance不就是不同的對象嗎?為什么最后能相等
問題解答
回答1:因為重寫了構造函數后, 返回一個對象, 這個對象會覆蓋你 用new 構造函數生成的那個對象,不知道我有沒有說清楚
回答2:@mpccc 說的對。
如果構造函數返回一個對象,那 new 出來的就是這個對象啦。
可以看看秘密花園中的構造函數這一段
回答3:我也是新手,嘗試解答一下,要是錯了可別怪我
第一 this是不是指的是不同的對象 在第一次調用構造函數的時候 產生一個空的對象 并且函數內部的this指向了這個空對象,接著執行代碼,最后返回這個對象 也就是uni。
而在第二次調用的時候由于第一次函數的改寫,產生了一個閉包,這個閉包的內部的instance正好指向了第一次調用時的產生的對象uni,當第二次執行new Universe()的時候你執行的是一個閉包,也會產生一個空的對象,但那個對象并沒有用到它,反而是直接返回了閉包內部的instance也就是uni。
所以uni2 === uni.
回答4:偏個題,這樣寫單例模式有點多余,要創建唯一的對象不用非得造個構造函數
var single = function(fn){ var instance; return function(){ return instance || (instance = fn .apply(this, arguments)); } }; 回答5:
不是注釋寫了嗎,重寫了構造函數啊,你new了一次之后再new就沒有var instance = this;這行代碼了,instance自然就不變了
//簡單打印一下就知道了console.log(Universe)var uni = new Universe()console.log(Universe)回答6:
首次執行new Universe()的時候,確實產生了一個新的this,并且將Universe構造函數改寫了,之后再次調用這個new Universe()的時候,就只會return instance了,不會產生新的對象了。
相關文章:
1. css3 - 求教CSS圖標庫的寫法,也就是先做雪碧圖,然后寫一個css表,用的時候直接用class就可以了2. 百度地圖api - Android百度地圖SDK,MapView上層按鈕可見卻不可觸,怎么解決?3. html - 前端大牛都頂一下!CSS鼠標樣式問題,如圖所示4. javascript - es6擴展運算符...的問題5. 網頁爬蟲 - python爬蟲用BeautifulSoup爬取<s>元素并寫入字典,但某些div下沒有這一元素,導致自動寫入下一條,如何解決?6. node.js - 在nodejs環境中如何配置webhook以實現hexo博客的自動更新?7. html5 - canvas中的mousedrag事件,為什么鼠標拖出canvas,然后再次移入canvas,drag事件還觸發8. javascript - jquery怎么給select option一個點擊時觸發的事件,如圖 如果選擇自定義觸發一個時間?9. 新入手layuiadmin,部署到tp中。想用php自已寫一個后臺管理系統。10. mysql 獲取時間函數unix_timestamp 問題?
