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

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

本文关键字:对象 设置 定义 组合 Javascript      更新时间:2023-09-26

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

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

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 等。

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

谢谢

可以使用getter。

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/

你不能像

你显示的那样用"静态"声明来做你要求的事情,因为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")];

很多选择。