2012-05-30 3 views
0

Я использую контекст Canvas 2d писать текст на экране ..Значение по умолчанию для объекта

Для этого я запустить его через массив текстовых объектов, которые я создал, прямо сейчас у меня есть текстовые объекты с 3-мя свойств:

text.text 
text.x 
text.y 

text.text содержит строку для записи, text.x имеет значение для й позиции, и text.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"; 

он меняет текстString на строку вместо объекта, а затем я больше не могу добавлять к нему свойства, так как это примитивный тип данных.

Благодаря

+0

Вы знаете, что можете использовать 'textStrings [0] = {текст: 'foo', x: 42, y: 42};'.Или даже 'var textStrings = [{text: 'foo', x: 42, y: 42}, {text: 'foo2', x: 42, y: 42}];' – zerkms

ответ

3

Вы можете использовать строковые объекты вместо примитивных значений:

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 массива.

+0

безупречное спасибо Берги! – dano

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

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 прототип, но это не рекомендуется, и практически так же, как и одно из решений, предоставленных Берги.

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; 
+0

Метод прототипа String не работает. Значения [в массиве] все еще примитивны, преобразуются в * разные объекты String каждый раз, когда вы обращаетесь к свойству. И '' ".x' всегда печатает' null'. – Bergi

+0

К сожалению, вы правы. Я обновил ответ. – Residuum

Смежные вопросы