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
你不能像你展示的那样用 "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")];
很多选择。
我很难描述我的情况,如果之前解决了这个问题,请原谅我。
我想按以下方式定义一个对象:
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
你不能像你展示的那样用 "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")];
很多选择。