0

Canvas 2d コンテキストを使用してテキストを画面に書き込みます。

これを達成するために、作成したテキスト オブジェクトの配列を実行します。現在、3 つのプロパティを持つテキスト オブジェクトがあります。

text.text
text.x
text.y

text.text は書き込む文字列を保持し、text.x は x 位置の値を保持し、text.y は y 位置の値を保持します。

text.text プロパティをスキップできる方法はありますか?

たとえば、現在は次のようになっています。

var textStrings = [];

textStrings[0] = {};
textStrings[0].text = "hello";
textStrings[0].x = 0;
textStrings[0].y = 10;

textStrings[1] = {};
textStrings[1].text = "world";
textStrings[1].x = 10;
textStrings[1].y = 10;

しかし、代わりにこのようなことを行う方法はありますか:

textStrings = [];
textStrings[0] = {};
textStrings[0] = "hello";
textStrings[0].x = "0";
textStrings[0].y = 10;

textStrings[1] = {};
textStrings[1] = "world";
textStrings[1].x = 10;
textStrings[1].y = 10;

基本的に、オブジェクトまたは何かのデフォルト プロパティ...

今、私が何かをするやいなや

textStrings[0] = "hello";

textStrings をオブジェクトではなく文字列に変更すると、プリミティブ データ型であるため、プロパティを追加できなくなります。

ありがとう

4

3 に答える 3

3

プリミティブ値の代わりにStringオブジェクトを使用できます。

var a = new String("hello");
a.x = "0";
a.y = 10;
var b = new String("world");
b.x = "10";
b.y = 10;

var textStrings = [a, b];

特別なオブジェクトを使用することもできます。このtoStringメソッドは、オブジェクトを文字列に変換するときに自動的に使用されます。

function Text(t, x, y) {
    this.text = t; this.x = x; this.y = y;
}
Text.prototype.toString = function() { return this.text; }
alert(new Text("hello", 0, 0)); // implicit string conversion
console.log(""+new Text("world", 10, 10)); // explicit string conversion

textStringsとにかく、配列の構文を単純化するために、そのようなコンストラクター関数があると思います。

于 2012-05-30T23:17:42.717 に答える
1

テキスト文字列が一意であることが保証されている場合は、それらをインデックス作成に使用できます。

var textStrings = {};
textStrings["world"].x = 10;
textStrings["world"].y = 10;

次に、次のスニペットを使用して、「テキスト」文字列のリストを取得できます (オブジェクトにインデックスを付けることができます)。

textkeys : function  (textStrings) {
   var accumulator = [];
   for (var propertyName in o) {
      arr.push(propertyName);
   }
   return accumulator;
}

snipplrから

于 2012-05-30T23:09:48.533 に答える
0

@Bergi のアイデアに似ていますが、オブジェクトを作成するために機能的なアプローチを使用しています。

var textCreator = function (text, x, y) {
    var that = {};

    that.text = text;
    that.x = x;
    that.y = y;

    that.toString = function () {
        return text;
    }

    return that;
};

textStrings = [];
textStrings[0] = textCreator("hello", 0 ,10);

textStrings[1] = textCreator("world", 10, 10);

完全を期すために: プロトタイプを拡張することもできますがString、それはお勧めできません。Bergi が提供するソリューションの 1 つと実質的に同じです。

String.prototype.x = null;
String.prototype.y = null;

textStrings = [];
//textStrings[0] = "hello";
textStrings[0] = new String("hello");
textStrings[0].x = "0";
textStrings[0].y = 10;

//textStrings[1] = "world";
textStrings[1] = new String("world");
textStrings[1].x = 10;
textStrings[1].y = 10;
于 2012-05-30T23:32:43.350 に答える