0

静的言語の「静的フィールド」に似たものを作成しようとしています。基本的に:counterプロパティは、init関数が呼び出されるたびにインクリメントする必要がありますが、どのインスタンスでもインクリメントする必要があります。これは私がテストに使用しているサンプルコードです(http://jsfiddle.net/HK8BY/2/):

var Widget = {
    counter: 0,
    init: function () {
        this.counter++;
        console.log("init called: " + this.counter);
    }
};

var t1 = Object.create(Widget);
var t2 = Object.create(Widget);
t1.init(); // should print: init called 1
t2.init(); // should print: init called 2
console.log(t1);
console.log(t2);

現在、console.logインスタンスを実行すると、 protoとinstanceの両方にcounterプロパティが含まれていることがわかります。このアプローチでは、プロトだけがそれを持っていると思いました。

では、プロトタイプでカウンターのみを持つように変更するにはどうすればよいですか?

4

3 に答える 3

2
var twitter = (function() {
    var counter = 0;
    return {
        init : function() { counter++; console.log("init called: " + counter); }
    };
}()); 

var t1 = Object.create(twitter);
var t2 = Object.create(twitter);

t1.init();
t2.init();

http://jsfiddle.net/HK8BY/1/

したがって、目的のオブジェクトを返すIEFE(即時実行関数式)を作成するだけです。変数は、そのcounterオブジェクトのinit関数を閉じるために使用できます。

于 2013-01-20T12:15:25.993 に答える
0
var Widget = {
    init: function () {
        this.prototype.counter++;
        console.log("init called: " + this.counter);
    }
};
Widget.prototype.counter = 0;

var t1 = Object.create(Widget);
var t2 = Object.create(Widget);
t1.init();
t2.init();
console.log(t1);
console.log(t2);
于 2013-01-20T12:17:42.010 に答える
0

コンストラクター関数でプロパティを定義することで静的フィールドをシミュレートできますがObject.create、代わりに使用する場合はnew、これは検討したいソリューションではない可能性があります。

function Widget() {
    this.init()
};

Widget.counter = 0;

Widget.prototype.init = function() {
    this.constructor.counter++;
    console.log("init called: " + this.constructor.counter);
};
于 2013-01-21T11:46:07.527 に答える