1

コードは次のとおりです。

//Note: x actually isn't defined, I'm pulling it from an external source

var x = [{ name: 'Michael Lovesllamas Lankford',
 created: 1338420951.11,
 laptop: 'pc',
 laptop_version: null,
 userid: '4fc6aed7eb35c14ad6000057',
 acl: 0,
 fans: 1,
 points: 5,
 avatarid: 34 }]

global.UserBase = {
 userid: -1,
 name: "noidea",
 isSuperUser: false,
 isDJ: false,
 laptop: "pc",
 afkWarned: false,
 afkTime: Date.now(),
 droppedTime: null,
 droppedRoom: null,
 songCount: 0,
 mWaitingSongLimit: 0,
 totalSongCount: 0,
 totalHeartCount: 0,
 totalHeartsGiven: 0,
 customGreeting: null,
 bootAfterSong: false,
 joinedTime: Date.now(),
 whiteList: false,
 allowedToReserveSpot: true
};

global.mUsers = {length:0};

global.Register = function(a) {
 for(var i = 0; i < a.length; i++) {
  var sUser = a[i];
  mUsers[sUser.userid] = CreateUser(sUser);
  mUsers.length++;
 }
};

global.CreateUser = function(a) {
 var b = Object.create(UserBase);
 b.userid = a.userid;
 b.name = a.name;
 b.laptop = a.laptop;
 if (a.acl > 0) b.isSuperUser = true;
 return b;
};

Register(x);

さて、問題に。mUsers[sUser.userid] がこれになる代わりに:

'4fc6aed7eb35c14ad6000057': {
 userid: "4fc6aed7eb35c14ad6000057",
 name: "noidea",
 isSuperUser: false,
 isDJ: false,
 laptop: "pc",
 afkWarned: false,
 afkTime: Date.now(),
 droppedTime: null,
 droppedRoom: null,
 songCount: 0,
 mWaitingSongLimit: 0,
 totalSongCount: 0,
 totalHeartCount: 0,
 totalHeartsGiven: 0,
 customGreeting: null,
 bootAfterSong: false,
 joinedTime: Date.now(),
 whiteList: false,
 allowedToReserveSpot: true
}

これは次のようになります。

'4fc6aed7eb35c14ad6000057': { 
 userid: '4fc6aed7eb35c14ad6000057',
 name: 'Michael Lovesllamas Lankford',
 laptop: 'pc' 
}

UserBase の残りの値がオブジェクトに追加されない理由はありますか?

4

3 に答える 3

0

Object.create新しいオブジェクトを作成し、prototype渡したオブジェクトに設定します。

オブジェクト初期化されていますが、新しいオブジェクト インスタンスにいくつかのプロパティを明示的に設定しているだけです。プロトタイプ オブジェクト ( ) のプロパティUserBaseはすべてアクセス可能ですがconsole.log、オブジェクトのダイレクトではそれらが出力されません。

たとえば、コードを実行した後、次のようにします。

for(var p in mUsers['4fc6aed7eb35c14ad6000057']) {
  console.log(p, mUsers['4fc6aed7eb35c14ad6000057'][p]);
}

プリントアウト:

userid 4fc6aed7eb35c14ad6000057
name Michael Lovesllamas Lankford
laptop pc
isSuperUser false
isDJ false
afkWarned false
afkTime 1340089066700
droppedTime null
droppedRoom null
songCount 0
mWaitingSongLimit 0
totalSongCount 0
totalHeartCount 0
totalHeartsGiven 0
customGreeting null
bootAfterSong false
joinedTime 1340089066700
whiteList false
allowedToReserveSpot true
于 2012-06-19T07:00:26.943 に答える
0

UserBaseはオブジェクト上にあり、オブジェクト上globalで呼び出す必要があります。Registerglobal

global.CreateUser = function(a) {
 var b = Object.create(this.UserBase);
 b.userid = a.userid;
 b.name = a.name;
 b.laptop = a.laptop;
 if (a.acl > 0) b.isSuperUser = true;
 return b;
};

global.Register(x);
于 2012-06-19T06:37:54.333 に答える
0

これは、ユーザー ID、名前、およびラップトップの値のみを初期化しているために発生しています。あなたのコードを見てください:

b.userid = a.userid;
b.name = a.name;  
b.laptop = a.laptop; 

目的の結果を得るには、Register(x) の代わりに Global.Register(x) を呼び出す必要があります。

于 2012-06-19T06:42:22.553 に答える