1

チェス盤のようなオブジェクトの 2 次元配列があります。

オブジェクトを取得できますdata.field(x,y);(オブジェクトはオブジェクトの2次元配列内に格納されます)

各フィールドに次の関数が必要です: topbottomleftright隣接フィールドを返します。

たとえばdata.field(3,3).top().left().bottom().name、フィールド名 (4,3) を返します。

しかし: オブジェクトごとにそれらの関数を宣言する必要がありますか? たとえば、同じ関数の 64 個のインスタンスとなる 8x8 フィールドでは、次のようになります。

data.field(0,0).top = function(){...}
data.field(0,1).top = function(){...}
...

ループ内で簡単に宣言できますが、それは純粋にメモリの無駄であり、それを行う方法ではないと確信しています。この関数を一度だけ宣言して、field(x,y) 関数によって返されるすべてのオブジェクト内で使用できるようにすることはできますか?

4

2 に答える 2

1

この関数を一度だけ宣言して、field(x,y) 関数によって返されるすべてのオブジェクト内で使用できるようにすることはできますか?

絶対:

function top() {
    // ...do your thing, using `this`
}

data.field(0,0).top = top;

topオブジェクトから取得する式の一部として が呼び出されると、へのfield(0,0)呼び出し内で がオブジェクトになります。などについても同様です。topthisfield(0,0)field(0,1)

詳細 (私のブログ):

これは、なんらかの理由で、field(0,0)およびそのようなオブジェクトが既にあることを前提としています (おそらく、それらは、制御していないコードによって作成されたものです)。コードを制御する場合は、代わりにプロトタイプ チェーンを介してこれを行うことができます。

function Field() {
}
Field.prototype.top = function() {
    // ...do your top thing, using `this`
};

...そして、フィールドを作成するとき:

yourField = new Field();

したがって、それは何でdata.fields(0,0)あるか、どこで入手するかによって異なります。

于 2013-03-04T17:25:56.523 に答える
0

メモリを節約したい場合は、プロトタイプを検討する必要があります。それらはオブジェクト指向言語のクラスに似ているため、メモリを最適化する機会があります。

var Field = function() {}; // this is your constructor
Field.prototype.top = function () { /* .. */
    return this; // return the field so you can do chaining: field.top().left();
};
Field.prototype.left = function () { /* .. */
    return this;
};
/* .. */
var field = new Field();
data.set(0, 0, field);
data.field(0, 0).top().left();
于 2013-03-04T17:28:41.167 に答える