Первый оператор определяет новый объект с одно свойство с именем 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"
Вы в действительности не добавляете свойство в первом случае. Вы заменяете любую «коллекцию», содержащуюся в объекте, который содержит одно свойство. Это не то же самое, что «добавить» свойство к уже существующему объекту. –
Вам необходимо прочитать: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects – CodingIntrigue
'Object.defineProperty' и' Object.defineProperties'. Обратите внимание, что 'obj.foo' является просто синтаксическим сахаром для' obj ['foo'] '. –