1

我有一个对象,其中一个属性是一个数组。我想在该数组上设置一个新属性(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
}

我可能需要将其拆分为一个单独的问题,但希望回答第一个的人会知道第二个的答案。

4

3 回答 3

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();
于 2011-11-11T15:06:54.770 回答
1

好吧,数组是基于数字的,所以

someArray["customProp"]: 0

行不通。它应该是一个 Javascript Object {} 才能使基于字符串的键起作用。然后你可以说

someArray: {0:"one",1:"two","customProp":0},

对于你的第二个问题:我认为这是不可能的。该对象尚未初始化,因此您还无法读取它...

于 2011-11-11T15:06:16.223 回答
0

您可以在 Array 上设置属性,但它们不会使用本机函数进行迭代。您的替代方案是一个对象(如建议的那样)或一个以对象作为成员之一的数组:

["one", "two", {customProp: 0}]
于 2011-11-11T15:52:59.800 回答