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 提供的解决方案之一相同。

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 回答