2016-05-10 4 views
7

私は仕事アプリのコード課題を解決しようとしていますが、私はこだわっていますし、任意の助けをいただければ幸いです。コードの挑戦:合計オブジェクトのインスタンスの数を追跡するクラスはFooを作成

質問:参照カウントと呼ばれるメソッドを持つクラスFooのを作成します。クラスまたはそのインスタンスのいずれかでrefCountを呼び出すと、インスタンスがいくつ存在するかが返されます。

例:

var f1 = new Foo(); 

f1.refCount(); // should be 1 
Foo.refCount(); // should be 1 

var f2 = new Foo(); 

f1.refCount(); //should be 2 
f2.refCount(); // should be 2 
Foo.refCount(); // should be 2 

私はこれまでこのようなものを持っている:私は、クラス自体にメソッドを添付する生命維持を使用してみましたが、その後、私は数字にできませんでした

function Foo() { 

    this.refCount = function() { 
    ++Foo.prototype.refs; 
    return Foo.prototype.refs; 
    } 

} 

Foo.prototype.refs = 0; 

新しいインスタンスを作成する方法を説明します。

+2

を参照してください。それにかかわらず、それは愚かな挑戦です、そのインスタンスを追跡するのはクラスの責任であってはなりません。 – Bergi

+1

@zerkms:それは本当に問題ではないですか? – Bergi

+0

@Bergiはそうではない、私が言ったことは何の意味もない。 – zerkms

答えて

1
function Foo() { 
    Foo.__n++; 
} 
Foo.refCount = function() { return Foo.__n; } 
Foo.__n = 0; 
Foo.prototype.refCount = Foo.refCount; 

出力:

> var f = new Foo(); console.log(f.refCount(), Foo.refCount()); 
1 1 
> f = new Foo(); console.log(f.refCount(), Foo.refCount()); 
2 2 
> f = new Foo(); console.log(f.refCount(), Foo.refCount()); 
3 3 
+0

これはコンストラクタが呼び出された時間をカウントしますが、存在するクラスインスタンスの量と完全に同じではありません。このソリューションを壊すもののいくつかの例を追加することをお勧めしますか? – flup

+1

解決に感謝します。私は誰かがそれのような関数にプロパティを追加することは見たことがありません。 – user6317504

+0

@ user6317504 "すべて"がjavascriptのオブジェクトであることを受け入れると、魔法の世界と栄光の世界が解かれます! – OneOfOne

0
var n = refs = 0; 

function refCount() { 
    refs = ++n; 
    return n; 
} 

function Foo() { 
    refCount() 
} 

var f1 = new Foo(); 
console.log(refs); 

var f2 = new Foo(); 
console.log(refs); 
2

行うことはできません。

JavaScriptはオブジェクト指向である、とJavaScriptのクラスは、特定のプロトタイプオブジェクトへのオブジェクトのprototypeプロパティを設定することで、作成したばかり幻想、です。

新しいはFoo()構文は、そのプロトタイプを設定するためのシンタックスシュガーです。他の人が見てきたように、最良のオプションは、コンストラクタ関数でrefCountingを実行し、呼び出された時間を効果的にカウントすることです。次に、カウント変数をプロトタイプに格納するか、またはコンストラクタ関数自体のプロパティまたはIIFE(以下を参照)のプロパティとして格納し、その値をrefCount関数に返します。

しかし、人々は、動的オブジェクトのプロトタイプを変更する起動した場合、オブジェクトは、クラスを変更することができますし、私はそれが起こったことを知って参照カウント機能なしの方法を考えることができます。

var Foo 

(function(){ 
    var n = 0; 
    Foo = function Foo() { 
    this.refCount = Foo.refCount; 
    n++; 
    }; 
    Foo.refCount = function() { 
    return n; 
    } 
})() 

function Bar() {} 

f = new Foo(); 
console.log("created f, refCount = 1", f instanceof Foo, f.refCount(), Foo.refCount()); 

g = new Foo(); 

console.log("created g, refCount = 2", f instanceof Foo, g instanceof Foo, f.refCount(), g.refCount(), Foo.refCount()); 

g.__proto__ = Bar.prototype; 
console.log("turned g into a Bar", f instanceof Foo, g instanceof Foo) 
console.log("but refCount still is 2", Foo.refCount()); 

h = Object.assign(f) 
console.log("created h without calling the constructor", h instanceof Foo) 
console.log("But refCount still is 2", h.refCount(), Foo.refCount()) 

See it on JSBin

あなたは、コンストラクタではなく、カウント方法でカウンターを増加する必要がhttps://developer.mozilla.org/en/docs/Web/JavaScript/Inheritance_and_the_prototype_chainHow to set the prototype of a JavaScript object that has already been instantiated?

関連する問題