2015-09-09 55 views
0

對於5個「同類」原型函數,我得到了CodeClimate的重複副本,作爲導致D評級的重複。如何在JavaScript中結合原型函數樣式?

我的知識缺乏如何組合/不重複類似的代碼來改善我的「代碼風格」。對你的幫助表示感謝。

的原型:

SomeThing.prototype.destination = function(path) { 
    if (!arguments.length) { 
    return this.path(this._destination); 
    } 
    assert(is.string(path), 'You must pass a destination path string.'); 

SomeThing.prototype.frontmatter = function(frontmatter) { 
    if (!arguments.length) { 
    return this._frontmatter; 
    } 
    assert(is.boolean(frontmatter), 'You must pass a boolean.'); 

SomeThing.prototype.clean = function(clean) { 
    if (!arguments.length) { 
    return this._clean; 
    } 
    assert(is.boolean(clean), 'You must pass a boolean.'); 

SomeThing.prototype.concurrency = function(max) { 
    if (!arguments.length) { 
    return this._concurrency; 
    } 
    assert(is.number(max), 'You must pass a number for concurrency.'); 
+0

你是什麼意思與 「合」?你想避免重複'SomeThing.prototype'?然後使用Object.assign。 – Oriol

+0

我認爲重複是arguments.length檢查加上相似的斷言。 –

+0

我確實相信你們倆都是對的 - @ Travis。我一直在看這[Mozilla文檔](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign),但正如我所說,我的知識並沒有幫助我有了這個。 – CelticParser

回答

0

這會幹出你的代碼:

function makeProp(prop, type) { 
    return function(someArg) { 
     if (!arguments.length) return this['_' + prop]; 
     var msg = 'You must pass a ' + type + ' for ' + prop; 
     assert(is[type], msg) 
    } 
} 

Something.prototype = { 
    destination: makeProp('destination', 'string'), 
    frontmatter: makeProp('frontmatter', 'boolean'), 
    clean: makeProp('clean', 'boolean'), 
    concurrency: makeProp('concurrency', 'number') 
} 
+0

這正是我現在正在做的。 – CelticParser

+0

如果你需要進一步幹掉你的代碼,你可以換掉'makeProp'中的參數順序,然後做'var makeBoolean = makeProp.bind(makeProp,'boolean')'然後'Something.prototype。 frontmatter = makeBoolean('frontmatter');',如果你有其他使用這些方法的方法,'string'和'number'是相同的。 – caasjj