2016-11-19 8 views
1

これは愚かな質問かもしれませんが、私はjavascriptを初めて使うので、作成されたオブジェクトで別の関数を呼び出した後にJavascriptで作成されたオブジェクトのプロパティ値が定義されていません

私が作成した以下のnotificationSocketEventHandlerオブジェクトいます

const notificationSocketEventHandler = Object.create(socketHandlerProto, { 
    validators: { 
    created: [], 
    destroyed: [], 
    loadedFromSocket: [], 
    updated: [], 
    addedto: { 
     relation: [] 
    }, 
    removedfrom: { 

    } 
    }, 
    created: function (data) { 
    if (this.validateProfileData(data, validators.created)) {} else {} 
    }, 
    destroyed: function (data) {}, 
    updated: function (data) {}, 
    loadedFromSocket: function (data) { 
     console.log('Loaded from socket') 
     console.log(data) 
    } 
}) 

このイベントハンドラはそうソケット からの通知をリッスンするために使用されており、イベントのプロトタイプがあるこの

$.globals.socket.on('notifications',notificationSocketEventHandler); 

のように設定されていますそのように定義される:

$.globals.socket = { 
    events: {}, 
    on: function (attr, func) { 
    if (!attr) return false 
    this.events[attr] = this.events[attr] || []; 
    this.events[attr].push(func) 
    return true 
    }, 
    remove(attr, func) { 
    if (!events[attr]) return false 

    this.events[attr].forEach(function (f, indx) { 
     if (f === func) { 
     events[attr].slice(indx, 1) 
     } 
    }) 
    }, 
    trigger: function (attr, thisArg, paramArgs) { 
    if (Array.isArray(attr) && attr.length) { 
     var obj = this.events[attr[0]] 
     for (var i = 1; i < attr.length; i++) { 
     if (!obj) return 
     obj = obj[attr[i]] 
     } 
     if (typeof obj == 'function') obj.apply(thisArg, paramArgs) 
     if (Array.isArray(obj)) { 
     obj.forEach(function (c) { 
      if (typeof c == 'function') c.apply(thisArg, paramArgs) 
     }) 
     } 
     return 
    } 
    if(this.events[attr]){ 
     console.log(this.events[attr]) 
     this.events[attr].forEach(function (f) { 
     if (typeof f === 'function') 
      f.apply(thisArg, paramArgs) 
     }) 
    } 
    } 
} 

問題は、notificationSocketEventHandlerオブジェクトが$.globals.socket.on関数に渡され、最終的にイベントオブジェクトにプッシュされた後、created,destroyedloadedFromSocketなどのプロパティが$.globals.socket.on関数に渡される前に関数として定義されていることですイベントオブジェクト内で一度 `undefined 'になると、なぜですか?

答えて

2

Object.createはちょっと混乱します.2番目のパラメータとして通常のオブジェクトを使用することはできません。これは 'プロパティ記述子'のオブジェクトでなければなりません。あなたは面倒なことになるだろうそれらのプロパティを反復処理していない限り

const notificationSocketEventHandler = Object.create(socketHandlerProto, { 
    'validators': { 
    value: { 
    'created': { 
      value: [] 
     }, 
     'destroyed': { 
      value: [] 
     }, 
     'loadedFromSocket': { 
      value: [] 
     } 
    }  
    } 
}); 

:正しく動作するために、あなたのコードは、これらの線に沿ってフォーマットする必要があります。あなたはObject.createを回避し、ちょうど通常のオブジェクトを作成するオフはるかに良いでしょう:

const notificationSocketEventHandler = { 
    created: [], 
    destroyed: [], 
    etc... 
} 

またはコンストラクタのプロトタイプにプロパティを追加する(さておき、人々は通常、それはすぐですので、コンストラクタ名は大文字で始まる作るよう明らかに、彼らはコンストラクタです - あなたは一つの名前の末尾に「プロト」を追加することがなくなります。とにかく):

var SocketHandler = function { 
    this.created = []; 
    this.destroyed = [] 
    etc... 
} 

const notificationSocketEventHandler = new SocketHandler 

または

var SocketHandler = {}; 
SocketHandler.prototype.created = []; 
SocketHandler.prototype.destroyed = []; 
etc... 
関連する問題