如何链接两个JavaScript对象?

时间:2017-04-30 14:39:00

标签: javascript node.js object indexing reference

假设我有一个对象(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,但这里的想法是用户将随着时间的推移不断更新新属性,所以我希望它能够做到我上面描述的内容。

2 个答案:

答案 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);

http://jsbin.com/nojolizewu/edit?console