實例

0

我有一個開始作爲ES5.1的一個項目,後來我改成了支持ES6所以我是用異步的await,讓...實例

現在我需要具有類似於實例的模塊/對象。

我發現this文章,解釋的過程,但...

當我這樣做:

'use strict'; 

let _ = require('lodash'); 
var mappings; 

function SafeRequestHandler(reqMappings) { 

    if (!(this instanceof SafeRequestHandler)) { 
     return new SafeRequestHandler((reqMappings)); 
    } 

    mappings = reqMappings; 
} 

function safeHandleReq(req, res) { 
    try { 
     let pair = _.find(mappings, {'url': req.url}); 
     return pair.handler(req, res); 
    } catch (err) { 
     console.log(err); 
    } 
} 

SafeRequestHandler.prototype.safe = safeHandleReq; 

module.exports = SafeRequestHandler; 

但現在,每次我這樣做:

var handler = require('../util/safeRequestHandler'); 

let handlerMappings = [ 
    { 
     url: def.party_create, 
     handler: partyCreate 
    }, 
    { 
     url: def.party_modify, 
     handler: partyModify 
    }, 
    { 
     url: def.party_get, 
     handler: partyGet 
    } 
]; 

var handle = new handler(handlerMappings).safe; 

我得到this.mappings REPLACED在SafeRequestHandler例如。這不是一個實例。

所以我試圖ES6方法定義處理程序:

'use strict'; 

let _ = require('lodash'); 

class SafeRequestHandler { 

    constructor(reqMappings) { 
     this.mappings = reqMappings; 
    } 

    safeHandleReq(req, res) { 
     try { 
      let pair = _.find(this.mappings, {'url': req.url}); 
      return pair.handler(req, res); 
     } catch (err) { 
      console.log(err); 
     } 
    } 

} 

並創建實例,如:

let handlerMappings = [ 
    { 
     url: def.party_create, 
     handler: partyCreate 
    }, 
    { 
     url: def.party_modify, 
     handler: partyModify 
    }, 
    { 
     url: def.party_get, 
     handler: partyGet 
    } 
]; 

let handle = new SafeRequestHandler(handlerMappings).safeHandleReq; 

..但這種方式在safeHandleReq(...)我甚至不能伸手mappingsthis是undefined,mappings是undefined

我想我只是不完全瞭解基本原理,所以能否請您正確&解釋這兩種方法有什麼問題?

謝謝!

+0

否ES6方式應該正常工作。 –

+0

好吧,正如我所說..我無法達到'映射'一切都是未定義的 – greengold

+0

不,它很好。你會得到什麼錯誤? –

回答

1

你將失去​​的情況下:您可以使用此過。

// handle doesn't have a pointer to its context (aka, this) 
let handle = new SafeRequestHandler(handlerMappings).safeHandleReq; 
// so handle() will output cannot read property mappings of undefined 

將其更改爲:

const instance = new SafeRequestHandler(handlerMappings); 

const handle = (...args) => instance.safeHandleReq(...args); 

更多的信息在這裏:Losing "this" context in JavaScript when passing around members

+0

這是純金,男人!我不明白它有點但它完全有效:)將學習通過。謝謝! – greengold

+0

哦,男人:/,所以obvius,我沒有看到它。我更喜歡.bind(實例)或.call(實例) –

+0

'Flat Functions'更高性能。 – Hitmands

0

您的第一個代碼創建了一個全局變量,因此只有一個值。如果你存儲一個特定的類實例的method到一個變量

let _ = require('lodash'); 
function SafeRequestHandler(reqMappings) { 
    if (!(this instanceof SafeRequestHandler)) { 
    return new SafeRequestHandler((reqMappings)); 
    } 
    this.mappings = reqMappings; 
} 

SafeRequestHandler.prototype.safeHandleReq = function(req, res) { 
    try { 
     let pair = _.find(this.mappings, {'url': req.url}); 
     return pair.handler(req, res); 
    } catch (err) { 
     console.log(err); 
    } 
} 
module.exports = SafeRequestHandler; 
+0

TypeError:無法讀取未定義的屬性'映射' ..我得到了:/ – greengold

+0

@greengold然後theres一些棉絨/等。用你的代碼做非常非常糟糕的東西:/ –

+0

相信我,我很少,我不使用linter這樣的東西。我唯一擔心的是我在7.7.3上將ES5和ES6混合在一起......花了幾個小時在這個上面:( – greengold