Javascript:通过组合先前定义的键在对象上设置键

Javascript: setting a key on the object by combining previously defined keys

我很难描述我的情况,如果之前解决了这个问题,请原谅我。

我想按以下方式定义一个对象:

var foo = [
   {
      firstName : 'John',
      lastName : 'Doe',
      fullName : this.firstName + this.lastName
   },
    // OR
   {
      firstName : 'Jane',
      lastName : 'Doe',
      herID : Do-something with the first and last name that were just defined, such as computeCombination(firstName, lastName)
   }
]

这样的申报可以吗?

我需要在此处立即完成 foo 的声明,以后无法更改该对象。而且这里不想涉及索引,比如使用foo[0].firstName等..

我想要这个的主要原因是,我不想再写相同的字符串,因为它是多余的,而且字符串很长。此外,数组中的每个对象对于最后一个键可能具有不同的组合逻辑。

谢谢

可以使用 getters

var foo = [ 
   {
      firstName : 'John',
      lastName : 'Doe',
      get fullName(){ return this.firstName +' '+ this.lastName; }
   }]


console.log( foo[0].fullName ); //John Doe

http://jsfiddle.net/6jq8ky0k/1/

你不能像你展示的那样用 "static" 声明来做你要求的事情,因为 this 没有设置为静态声明中的对象,所以你不能引用其他使用 this 的对象属性,但是如果您想要使用相同的逻辑来制作 fullName 属性,您可以使用这样的构造函数通过动态声明来实现:

function Person(firstName, lastName) {
   this.firstName = firstName;
   this.lastName = lastName;
   this.fullName = firstName + " " + this.lastName;
}

var people = [new Person("John", "Doe"), new Person("Jane", "Doe")];

如果您希望每个条目都有不同的逻辑,那么您可以将回调传递到 Person() 构造函数中,该构造函数定义要使用的逻辑,如下所示:

function Person(firstName, lastName, fn) {
   this.firstName = firstName;
   this.lastName = lastName;
   this.fullName = fn(firstName, lastName);
}

function combine(f, l) { return f + " " + l;}
function makeID(f, l) {return f.slice(0, 1) + l;}

var people = [new Person("John", "Doe", combine), new Person("Jane", "Doe", makeID)];

或者,如果您真的想要其他属性有不同的东西,那么也许数组中的所有对象都不是同一类型的对象,因此当您想要不同的东西时可以使用不同的构造函数。您还没有真正解释您的目标是什么,所以我们无法就细节提供真正的建议。但是,关键是你有很多不同的选择来计算基于原始两个名称的其他属性。这是一个具有不同构造函数的示例:

function PersonName(firstName, lastName) {
   this.firstName = firstName;
   this.lastName = lastName;
   this.fullName = firstName + " " + lastName;
}

function PersonID(firstName, lastName) {
   this.firstName = firstName;
   this.lastName = lastName;
   this.herID = firstName.slice(0, 1) + lastName;
}

var people = [new PersonName("John", "Doe"), new PersonID("Jane", "Doe")];

很多选择。