Объявление объектов как параметров не работает? - PullRequest
0 голосов
/ 13 августа 2011

Я получаю ошибку «узел не найден» (DOM Exception 8), когда позже пытаюсь добавить объекты, которые я создаю с помощью этого кода:

object.addimgs = function(a){
        for (var i = 0; i < a.length; i++){
            a[i][0] = create("img", {position: "absolute"}, {src: a[i][1]});
        }
}

Массив, который я подключаю для a, таков:

[[this.logo, "img/coffee.png"], [this.door, "img/door.png"]]

Итак, по сути, я пытаюсь использовать цикл for для объявления объектов, потому что он будет более эффективным, чем то, что я работал раньше:

this.logo = create("img", {position: "absolute"}, {src: "img/coffee.png"});
this.door = create("img", {position: "absolute"}, {src: "img/door.png"});

... и т. Д.

(create(a, b, c){ - это пользовательская функция, я знаю, что приведенный выше код работает)

Есть идеи, почему это не сработает? Прекращают ли объекты быть объектами, когда они вводятся в качестве параметра?

Ответы [ 2 ]

2 голосов
/ 13 августа 2011

Я вижу, что вы пытаетесь, но присвоение a[i][0] назначит слоту массива, а не тому, что содержит слот массива.

Далее, когда вы создаете массив следующим образом:

[[this.logo, "img/coffee.png"], [this.door, "img/door.png"]]

Элемент массива [0][0] не является ссылкой на член this.logo, как вы ожидаете.Элемент массива [0][0] будет содержать значение this.logo во время создания массива, которое, скорее всего, будет undefined.

Вместо этого попробуйте что-то вроде этого:

object.addimgs = function(a){
    for (var i = 0; i < a.length; i++){
        a[i][0][a[i][1]] = create("img", {position: "absolute"}, {src: a[i][2]});
    }
}

Затем вызовите его с этим массивом:

[[this, "logo", "img/coffee.png"], [this, "door", "img/door.png"]]
1 голос
/ 13 августа 2011

Всякий раз, когда у вас есть <object>.<property> в JavaScript, его можно использовать для возврата или установки значения.Его нельзя использовать как указатель.В этом случае:

var o = {}
function setToFoo( v ){ v = "foo" }
setToFoo( o.foo );
console.log( o.foo ); // undefined

Если вы хотите назначить что-то динамически, то вы должны использовать синтаксис массива: <object>["name"] = #value и назначить таким образом:

var a = [["logo", "img/coffee.png"], ["door", "img/door.png"]]
for (var i = 0; i < a.length; i++){
     this[a[i][0]] = create("img", {position: "absolute"}, {src: a[i][1]});
}

Если бы я строилчто-то наподобие вашего метода, однако, я бы на самом деле использовал отображение ключей => в динамическом объекте, чтобы сделать его более очевидным:

object.addimgs = function(obj, src){
   for (var it in src ){
       obj[it] = create("img", {position: "absolute"}, {src: src[it]});
   }
}

var src = {logo: "img/coffee.png", door: "img/door.png"}
var obj = // whatever your "this" is
object.addimgs(src, obj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...