Мне нужно лучше понять фундаментальную природу объектов Javascript - PullRequest
1 голос
/ 15 февраля 2012

Если я объявлю объект следующим образом:

var foo.bar = new Object;

Это автоматически делает объект foo?Если нет, и я хочу, чтобы и foo, и foo.bar были объектами, мне нужно использовать следующий код:

var foo = new Object;
var foo.bar = new Object;

И если я создаю эти два объекта, как указано выше, существуют ли отношения родитель / потомок междуони или они совершенно разные сущности?

Я прошу прощения за простую природу моего вопроса, но я пытаюсь более полно понять различные способы структурирования данных.

Ответы [ 4 ]

3 голосов
/ 15 февраля 2012

Если я объявлю объект следующим образом:

  var foo.bar = new Object;

Это автоматически превращает объект в объект?

Нет. Это синтаксическая ошибка;

SyntaxError: неожиданный токен .

Если нет, и я хочу, чтобы и foo, и foo.bar были объектами, мне нужно использовать следующий код:

var foo = new Object;
var foo.bar = new Object;

Нет, это снова синтаксическая ошибка. Вы должны использовать.

var foo = new Object;
foo.bar = new Object;

Но в наши дни более распространенным является использование буквального синтаксиса объекта ;

var foo = {
    bar: {

    }
}

И если я создам эти два объекта, как указано выше, есть ли между ними родительские или дочерние отношения или они совершенно разные сущности?

Это совершенно разные сущности. Единственная связь между ними заключается в том, что foo содержит ссылку на bar. Что-то еще может легко содержать ссылку на бар;

var baz = foo.bar;
// Now baz and foo.bar are both pointing to the same object

alert(baz === foo.bar); // true;
baz.attr = 1;
alert(baz.attr); // 1
alert(foo.bar.attr); // 1

delete foo.bar; // delete foo's reference to bar
alert(baz.attr); // still shows 1
alert(foo.bar.attr); // error, because we deleted `bar`.

Попробуй сам ... http://jsfiddle.net/AMXLE/1

2 голосов
/ 15 февраля 2012
var foo.bar = new Object;

Это выдаст ошибку SyntaxError; символ . не допускается в именах переменных JavaScript. Это будет работать, хотя:

var foobar = new Object;

var foo = new Object; var foo.bar = новый объект;

Это не сработает по той же причине, что и раньше. Используйте это вместо:

// using the `Object` constructor
var foo = new Object;
foo.bar = new Object;

// or just use an object literal:
var foo = {
  'bar': {}
};

И если я создам эти два объекта, как указано выше, есть ли между ними родительские или дочерние отношения или они совершенно разные сущности?

Оба bar и foo являются объектами, но bar является свойством foo.

0 голосов
/ 15 февраля 2012

Мне нравится видеть это так, что объекты в Javascript в точности совпадают с ассоциативными массивами (хеш-таблицы, словари), где каждый ключ - строка, и каждое значение может быть любого типа, включая * 1001.*.Таким образом, ваш код ИМЕННО такой же, как:

var foo = {};
foo["bar"] = {};

Или даже:

var foo = {"bar": {}};
0 голосов
/ 15 февраля 2012

Этот первый пример вызовет ошибку, потому что foo ранее не был определен, но вы можете использовать литералы объекта:

var foo = { bar: new Object() };

Или даже:

var foo = { bar: {} };

С точки зрения вашего последнего вопроса, bar становится свойством foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...