假设我有一个对象(obj1),其中obj1中的一个值是另一个对象(obj2)。有没有办法让它在obj1中检查任何东西(例如obj1.username)也会自动检入obj2(obj1.ob2.username)?
这个用例是如果obj1中不存在某些东西,我还想在它返回null之前检查obj2。
示例用法:
var user = {username: "David"} // obj2
var member = {nickname: "Dave", user: user} // obj1
console.log(user.username) // "David"
console.log(user.nickname) // null
console.log(member.username) // "David"
console.log(member.nickname) // "Dave"
这适用于Node.js。
- 编辑 -
我忘了注意成员和用户是从我用来与名为Discord的应用程序进行交互的库中的类创建的。
当一条消息被发送时,一个事件被触发,我被传递给成员对象之类的信息(带有指向其中用户对象的链接)。
Here is the structure of a user.
Here is the structure of a member.
Object.defineProperty(Discord.Member.prototype, 'username', {
get: function() { return this.user.username; },
set: function(newValue) { this.user.username = newValue; }
});
上述方法按预期工作,但仅适用于username
属性。我考虑过将这个应用于用户的每个属性,但是当我尝试迭代创建用户的属性时,有些(如.createdAt
)没有显示在列表中。
我理解我可以手动完成并手动编写每个defineProperty,但这里的想法是用户将随着时间的推移不断更新新属性,所以我希望它能够做到我上面描述的内容。
答案 0 :(得分:0)
您可以使用Proxy
和内部使用getter
来检查属性是否存在于原始属性中,然后用于其他对象。
var user = {
username: "David"
} // obj2
var member = {
nickname: "Dave",
user: user,
} // obj1
var pMember = new Proxy(member, {
get: function(target, prop) {
if (target[prop]) return target[prop];
else if (target.user[prop]) return target.user[prop];
}
});
console.log(pMember.nickname)
console.log(pMember.username)
答案 1 :(得分:0)
使用继承:
var user = {username: "David"} // obj2
var member =Object.assign(Object.create(user),{nickname: "Dave", user: user}); // obj1
console.log(member.username);