Как установить свойство свойства при создании объекта
У меня есть объект и одним из свойств является массив. Я хочу установить новое свойство в этом массиве (customProp = 0). Тем не менее, я хочу сделать это в объявлении myObject.
myObject = {
someString: "text",
someArray: ["one","two"],
/* What I've Tried */
someArray: { customProp: 0 } // Overwrites my array with a new object
someArray["customProp"]: 0 // Invalid syntax
someArray: customProp: 0 // Also invalid
}
Если я не могу создать массив, а затем установить для него свойство, могу ли я сделать это одним махом (опять же, оставаясь в пределах границ этого объекта)?
У меня есть еще один (маленький) вопрос: как я могу ссылаться на одно из свойств, все еще внутри объявления. Я хочу установить otherProp = someString, как бы я это сделал?
myObject = {
someString: "text",
otherString: someString, // someString is undefined
otherString: myObject["someString"], // myObject is undefined
otherString: this["someString"] // Just... undefined
}
Возможно, мне придется разделить это на отдельный вопрос, но, надеюсь, тот, кто ответит на первый, будет знать ответ на второй.
3 ответа
К сожалению, ни один из ваших запросов не возможен. Объектные литералы в JavaScript удобны, но имеют недостатки, в основном то, что вы обнаружили.
Когда вы находитесь внутри литерала объекта, объект еще не совсем существует. Интерпретатор JavaScript еще не закончил принимать его. Так внутри буквального, this
указывает на объект только вне литерала, и литерал не может ссылаться на другие части самого себя.
К счастью, вы можете сделать то, что хотите, просто сделав это после буквального объявления.
myObject = {
someString: 'text',
someArray: ['one', 'two']
};
myObject.someArray.customProp = 0;
myObject.otherString = myObject.someString;
Или, если вы хотите, вы можете обернуть все это внутри функции конструктора и создать свой объект с new
,
function MyObject() {
this.someArray = ['one', 'two'];
this.someArray.otherProp = 0;
this.otherString = this.someString = 'text';
}
var myObject = new MyObject();
Ну, массивы основаны на числах, так
someArray["customProp"]: 0
не сработает. Это должен быть Javascript Object {}, чтобы работали строковые ключи. И тогда вы могли бы просто сказать,
someArray: {0:"one",1:"two","customProp":0},
На ваш второй вопрос: я не думаю, что это возможно. Объект еще не инициализирован, поэтому вы еще не можете прочитать его...
Вы можете установить свойства в массиве, но они не будут повторяться с использованием собственных функций. Ваши альтернативы - это объект (как предложено) или массив с объектом в качестве одного из членов:
["one", "two", {customProp: 0}]