Объект как имя свойства объекта? - PullRequest
0 голосов
/ 31 марта 2012

Возможно ли это в javascript?

Я пытаюсь установить имя свойства объекта как «HTMLInputElement»:

var el = $('#something').get(0),
    obj = {};

obj[el] = 'some random data'; 

, но я не думаю, что этоработает: (

Я получаю некоторую ошибку:

ncaught Ошибка: синтаксическая ошибка, нераспознанное выражение: [объект HTMLInputElement]

Но я неуверен, если это из-за того, что я пытаюсь сделать:)

Однако, когда я console.log (obj), он выглядит хорошо, с "object HTMLInputElement" внутри имен ключей, но я не знаю, еслиэто настоящий объект или просто какая-то строка

Ответы [ 4 ]

2 голосов
/ 31 марта 2012

Это, конечно, возможно.Все, что находится в скобках, разрешено.Вызывается метод toString().

// Test case:
var obj = {};
obj[document.body] = '1';
console.log(JSON.stringify(obj));  // Shows {"[object HTMLBodyElement]":"1"}


Проблема

После прочтения ваших комментариев я вижу, что вы пытаетесь сделать: Созданиекарта элементов DOM, для последующего использования в оболочке jQuery.Это не работает, потому что, как я уже говорил, ключи - это строки.

// Your intentions:
var obj = {};
var body = $('body').get(0);
obj[body] = {secret: 'Some text'};
$.each(obj, function(elem, data) {
    // Example:
    $(elem).text(data.secret);

    // Expected (filled in variables):
    $(body).text('Some text');

    // What actually happens
    $('[object HTMLBodyElement]').text('Some text');
    //  ^^^^^^^^^^^^^^^^^^^^^^ This is an invalid jQuery selector!
});

Решение

Использование WeakMap объектов для связывания объектов в виде пар ключ-значениебез принуждения стринга.Это не очень хорошо поддерживается, но это легко решить, используя polyfill .

1 голос
/ 31 марта 2012

Я провел тест на то, чего вы пытаетесь достичь.

Результаты моего теста показывают, что вы не можете получить тот же object (который вы установили в качестве ключа) при циклическом прохождении объекта.

var obj = {};
obj[document.body] = '1';

console.log(obj['[object HTMLBodyElement]']); /* prints 1 
# '[object HTMLBodyElement]' is the relative string
representation of the BODY object. */

console.log(obj[document.body]); /* prints 1
# because document.body converted into the relative string
'[object HTMLBodyElement]' */


for(var key in obj){

    if(obj.hasOwnProperty(key)){
        console.log(key); // prints [object HTMLBodyElement] # which is string...
    }

}

console.log(document.body); //prints <body> #which is the real object.

Что показывает вышеуказанный тест,

Когда вы пытаетесь использовать какой-либо объект (давайте назовем его keyObject) в качестве ключа в каком-либо другом obj с использованием нотации [], keyObject преобразуется в некоторую относительную строку, и эта строка используется в качестве ключа.

Таким образом, когда вы перебираете obj, вы получите относительную строку, а не реальный объект.

1 голос
/ 31 марта 2012

Синтаксис, подобный obj[el], работает, только если el - строка, а не какой-либо объект.Так, например, вы можете использовать для этого некоторый атрибут элемента (например, id или просто data-some-attr)

1 голос
/ 31 марта 2012

о, так это не настоящий объект?Это просто строковое представление объекта?Мне нужен реальный объект, чтобы я мог получить к нему доступ позже, когда я выполняю итерации (как объект).

Вероятно, вам следует создать структуру, содержащую как элемент HTML, так и «некоторые случайные данные».

var el = $('#something').get(0),
    obj = {}, tmpArray = [];

tmpArray.push(el);
tmpArray.push('some random data');

obj['uniqueKey1'] = tmpArray; //['some random data', [object HTMLInputElement]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...