这是一个创建于 3710 天前的主题,其中的信息可能已经有所发展或是发生改变。
今天隨便玩了一道 CodeWar 的題。
題意大致就是你需要實現一個 Singleton 也就是單件模式的類,讓其下面代碼執行成功:
var obj1 = new Singleton();
var obj2 = new Singleton();
obj1 === obj2; // => true
obj1.test = 1;
obj2.test; // => 1
並且還有很重要的一點就是 Singleton 的對象的 instanceof 也得的確是 Singleton 才行。
=== 開始試驗 ===
我們猜想 new Singleton() 的結果,如果 Singleton 函數也就是這個類的構造函數沒返回值的話,直接會返回 this,有返回值的話,那麼就是等於其返回值了。
我們碼下面的代碼看一下:
var Singleton = function() {
return { foo: "bar" };
};
console.log(new Singleton());
跑一遍之後我們的確發現了輸出的值就是:
{ foo: "bar" }
=== 小作弊失敗 ===
於是我這麼做:
var foo = {};
var Singleton = function() {
return foo;
};
結果上面的幾個條件都符合了,不信大家可以自己輸出一遍看看。
但是——
這東西不是一個 Singleton 的實例,它只是一個簡單的 JSON 對象,所以還是無法通過。
=== 死月の正解 ===
答案有很多,CodeWar 上面每個人的解法都不一樣,但是歸根結底本質還是大同小異的。
就是第一次的時候先直接返回 this,並且把 this 放在某個地方。以後每次來這裏創建的時候返回之前存好的 this 即可:
var Singleton = function() {
if(Singleton.prototype.instance) return Singleton.prototype.instance = this;
// Do some initialize things
// ...
Singleton.prototype.instance = this;
return this;
};
=== 別的寫法 ===
寫法很多,我這裏隨意挑幾個別人的答案吧。
/**
* By tjwudi
*/
var Singleton = function(){
return Singleton.ins = Singleton.ins ? Singleton.ins : this;
};
/**
* By nonowarn
*/
var Singleton = (function () {
var instance = null;
return function(){
return instance || (instance = this);
};
})();
2 条回复 • 2014-10-04 13:03:52 +08:00
|
|
1
djchurch007 2014-09-30 16:30:12 +08:00
撸猪,泥蜇嚒腻害,偶阔以败你为湿摸?
|
|
|
2
magicdawn 2014-10-04 13:03:52 +08:00
不是可以改proto吗
```js function Singleton () { return singleton_instance; } var singleton_instance = { __proto__ : Singleton.prototype };
var obj1 = new Singleton var obj2 = new Singleton
require('assert')(obj1 === obj2); require('assert')(obj1 instanceof Singleton); ```
|