2017-04-30 44 views
1

假設我有一個對象(obj1),obj1中的其中一個值是另一個對象(obj2)。有什麼辦法可以讓obj1(例如obj1.username)中的任何東西都能自動檢查obj2(obj1.ob2.username)嗎?如何鏈接兩個JavaScript對象?

這種情況下的用例是,如果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的

- 編輯 -

我忘了注意,成員和用戶從班我使用一個名爲不和諧的應用程序進行交互庫創建。

當一個消息被髮送時,一個事件被觸發,並且我得到了像成員對象那樣的信息(帶有一個到它內部的用戶對象的鏈接)。

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

write user.prototype = member – binariedMe

+0

'{get nickname(){return this.user.username},user}'? – Bergi

回答

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)

+0

我無法爲「成員」創建新變量,它需要針對已存在的成員。 – Vaeb

+0

這個https://jsfiddle.net/Lg0wyt9u/1859/怎麼樣? –

+0

成員來自一個庫的類,所以我需要更改從該類創建的成員對象。 'Object.defineProperty(Discord.Member。原型,'用戶名',{ \t get:function(){return this.user.username; }, \t set:function(newValue){this.user.username = newValue; } });' 這適用於用戶名屬性,但我需要它爲https://github.com/hydrabolt/discord.js/blob/stable/src/structures/User.js的所有屬性#L9。如果我遍歷一個用戶,我可以重複defineProperty方法,但是其中的一些屬性(如createdAt)在迭代時不顯示。 – Vaeb

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