【发布时间】:2017-09-28 04:31:36
【问题描述】:
假设我有一个对象 (obj1),其中 obj1 中的一个值是另一个对象 (obj2)。有什么办法可以让检查 obj1 中的任何内容(例如 obj1.username)也会自动检查 obj2(obj1.ob2.username)?
这种情况的用例是如果 obj1 中不存在某些东西,我还想在 obj2 返回 null 之前检查它。
示例用法:
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,但这里的想法是用户将随着时间的推移不断更新新属性,所以我希望它执行我上面描述的操作。
【问题讨论】:
-
如果成员是用户,它似乎是原型继承的一个不错的用例(或者“类”,如果你这样做的话)。
-
写 user.prototype = member
-
{get nickname() { return this.user.username }, user}? -
@binariedMe 号
-
我将它用于 Discord 机器人应用程序,因此成员和用户都是通过诸如“已发送消息”之类的事件提供给我 (discord.js.org/#/docs/main/stable/class/GuildMember) 的对象。
标签: javascript node.js object indexing reference