這是我修改的基於one by Rob Dodson的示例。具有緩存靜態屬性的JavaScript單例模式如何工作?
function User() {
// do we have an existing instance?
if (User.instance) {
return User.instance;
}
// proceed as normal
this.firstName = 'John';
this.lastName = 'Doe';
// cache
User.instance = this;
// implicit return
// return this;
}
a = new User();
b = new User();
b.firstName = "Paul"
console.log(a)
我剛學,所以我可能會使用打下術語,但如果我理解正確,User.instance = this;
克隆User
,而克隆成爲唯一User
我們可以訪問了。因此,全過程中它經過是這樣的:
a = new User();
做我們現有的User.instance
?所以繼續通過代碼並將a.firstName
設置爲John,將a.lastName
設置爲Doe。現在製作一個名爲John Doe的this
對象的副本,並將其設置爲User
構造函數的永久部分。是什麼使它永久?因爲代碼永遠不會再次設置該行。爲什麼?因爲...
b = new User();
我們有現成的User.instance
?是。所以return
User.instance
我們已經存儲,並退出功能。
a
是指User.instance
? - 我不明白this
的隱性回報是如何返回到a
- 而b
是它的克隆。
函數也可以有屬性,所以設置'User.instance = this;'將函數本身第一次創建的內存保存起來。所以當它再次被調用時,它會檢測它的實例屬性是否存在,並返回緩存的實例。而b不是一個克隆,它是對同一個對象的引用,因此當你將b.firstName改爲paul時,a.firstName也是paul。 – Shilly