2014-09-02 3 views
0

Следующие 3 метода, с которыми я сталкивался, какие свойства могут быть добавлены к объекту.Различные методы добавления свойств к объекту javascript

> collection = {key0: 'value0'} 
{ key0: 'value0' } 

> collection.key1 = 'value1'; 
'value1' 

> collection['key2'] = 'value2'; 
'value2' 

> collection 
{ key0: 'value0', 
    key1: 'value1', 
    key2: 'value2' } 

Существуют ли другие методы, посредством которых свойства могут быть добавлены к объекту.

Все ли 3 метода выполняют ту же работу?

+1

Вы в действительности не добавляете свойство в первом случае. Вы заменяете любую «коллекцию», содержащуюся в объекте, который содержит одно свойство. Это не то же самое, что «добавить» свойство к уже существующему объекту. –

+1

Вам необходимо прочитать: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects – CodingIntrigue

+0

'Object.defineProperty' и' Object.defineProperties'. Обратите внимание, что 'obj.foo' является просто синтаксическим сахаром для' obj ['foo'] '. –

ответ

1

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

Вторые и третьи примеры изменить collection объект таким же образом, разница заключается в невозможности использовать имя переменного свойства в точечной нотации:

// Let's say we have an object 
var collection = { key0 : "value0" }; 

// Let's say for some reason we want to use a variable as a property name 
var keyName = "key1"; 

// This won't assign "someValue" to the property "key1" as you would expect 
// instead it will assign it to the property "keyName" (the string, not the variable) 
collection.keyName = "someValue"; // OOPS 

// With bracket notation you can use a variable (or any expression) as a property name 
collection[keyName] = "value1"; // Sweet 
1

Первый оператор определяет новый объект с одно свойство с именем key0.

Второй оператор присваивает значение свойству объекта с именем key1. Поскольку объект не имеет собственного свойства с именем key1, свойство создается.

Третий оператор идентичен второму утверждению. Основные причины для использования кронштейна обозначения вместо точечной нотации является:

  • свойства со специальными символами, например, collection["foo-bar"] относится к свойству под названием foo-bar, но collection.foo-bar выполняет операцию вычитания на collection.foo и bar.

  • переменные имена свойств, например, вы можете сделать var propName = "key0"; collection[propName] = ...

Единственным способом определить свойства есть с Object.defineProperty (и множественным вариантом Object.defineProperties). Это позволяет вам определять свойства, которые ведут себя особыми способами.

Object.defineProperty(collection, "key3", { 
    enumerable: false, // property will not show up in for-in loops 
    configurable: false, // property cannot be changed 
    set: function(val) { 
     alert("we tried to set key3 to " + val); 
    }, 
    get: function() { 
     alert("this code runs when we get collection.key3"); 
     return "value3"; 
    } 
}); 

collection.key3 = 6; // alerts "we tried to set key3 to 6" 
collection.key3;  // alerts "this code runs when we get collection.key3" 
         // and returns the string "value3" 
Смежные вопросы