2016-06-01 2 views
-1

Я могу получить свойство первого уровня, просто найти его, но он не позволит мне получить доступ к свойству «оттенок» под цветом. Обычно вы просто используете точку на любом уровне, который хотите достичь, но он не работает для меня.Доступ к вложенным свойствам в функции через массивы: Javascript

obj = new Object(); 

obj.color.tint = "brick red"; 

alert(obj.color); 

var arr = []; 

arr[0] = obj; 

alert(arr[0].color.tint); 
+0

Этот код выдает ошибку. Вы можете проверить консоль разработчика (нажать F12) для отладки в будущем. – 4castle

ответ

0

obj = new Object(); 
 

 
obj.color = new Object(); // Try add this line 
 

 
obj.color.tint = "brick red"; 
 

 
alert(obj.color); 
 

 
var arr = []; 
 

 
arr[0] = obj; 
 

 
alert(arr[0].color.tint);

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

В основном Javascript - это все объекты, и вы можете использовать точечную нотацию для доступа к существующему объекту .

вы можете получить доступ к obj.color, потому что вы инициализируете obj как объект на первом месте.

Так, подобным образом, если вы хотите установить свойства под obj.color, вы должны инициализировать obj.color как новый объект, а затем вы можете получить доступ к obj.color.* по Вашему желанию

2
obj.color.tint = "brick red"; 

Эта часть будет не потому, что color не существует. JavaScript не «автозаполняет» пробелы. Сначала вы должны определить color как объект перед присвоением ему tint.

var obj = {}; 
obj.color = {}; 
obj.color.tint = 'brick red'; 

Кроме того, это может быть упрощена:

var obj = { 
    color: { 
    tint: 'brick red' 
    } 
}; 
+0

Большое спасибо –

+0

@ Shinji-san Обратите внимание, что использование 'new Object()' является плохой практикой. Лучше использовать литерал объекта '{}', чтобы вы не получили никаких сюрпризов, если какой-то другой код (например, библиотека) изменил «Object.prototype». – 4castle

0

Вы не можете цепи дот-нотация для создания вложенные элементы, поскольку color не определен в точке, к которой вы пытаетесь получить доступ к свойству;

ONW способ сделать это:

var obj = new Object(); 
obj.color = {}; 
obj.color.tint = 'tint'; 

Или:

var obj = new Object(); 
obj.color = {tint:'tint'}; 
+0

Спасибо, а что, если я хочу добавить опору для оттенка, не будет ли это color.tint = {transparent: 50}; или obj.color.tint = {transparent: 50}; Все это все равно будет объектами «obj», верно? –

+0

@ Синдзи-сан Вы можете вложить столько, сколько захотите. 'obj.my_properties = {visuals: {color: {tint: 'red'}}}' – hlfrmn

0

Вы не можете назначить свойства в несуществующий объект. Сначала вы должны создать этот объект. Однако иногда это необходимость. Предположим, вы хотите динамически создать такую ​​структуру объектов массива. Я разработал метод объекта для accomplist то, что Object.prototype.setNestedValue() Который работает как этот

Object.prototype.setNestedValue = function(...a) { 
 
    a.length > 2 ? typeof this[a[0]] === "object" && this[a[0]] !== null ? this[a[0]].setNestedValue(...a.slice(1)) 
 
                     : (this[a[0]] = typeof a[1] === "string" ? {} : new Array(a[1]), 
 
                     this[a[0]].setNestedValue(...a.slice(1))) 
 
       : this[a[0]] = a[1]; 
 
    return this; 
 
}; 
 

 
var arr = [].setNestedValue(0,"color","tint","brick red"); 
 
console.log(JSON.stringify(arr));

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