我有一个对象,其中一个属性是数组。我想在这个数组上设置一个新的属性(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
}
我可能需要把它分成一个单独的问题,但希望回答第一个问题的人知道第二个问题的答案。
不幸的是,您的两个请求都不可能。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},
对于你的第二个问题:我认为这是不可能的。
你可以在Array上设置属性,但是它们不会被本地函数迭代。您的备选方案是一个对象(按照建议)或一个数组,其中一个成员是对象:
["one", "two", {customProp: 0}]