使用Javascript" class"对函数的可选调用

时间:2014-08-21 18:03:51

标签: javascript node.js

我有以下节点模块:

var _ = require('lodash');

function Config(configType, configDir) {
  this.configType = configType;
  this.configDir = configDir;
};

Config.prototype.read = function() { // read file to buffer };
Config.prototype.modify = function() { // modify buffer };
Config.prototype.write = function() { this.modify(); // now write };

var base = _.curry(Config);
module.exports.A = base('A');
module.exports.B = base('B');
module.exports.C = base('C');

// In some other file
var config = require('config');
var a = new config.A('a/dir');
var b = new config.B('b/dir');
var c = new config.C('c/dir');

问题是,使用ConfigC,我实际上并不想调用modify方法。我已经考虑过在基于configType的write函数中做一个条件,但理想情况下我想让ConfigC“知道”该做什么,或者通过覆盖write函数或者其他一些我不知道的javascript-ism。

有谁知道这个问题的优雅解决方案?

1 个答案:

答案 0 :(得分:1)

使用子类。我们不是在子类中减去修改行为,而是让基类进行修改,然后在子类中添加该行为。

// Add the below to the definition of Config in the question
Config.prototype.write = function() { /* do not modify */ };

// Define subclass which adds modify behavior
function ConfigModify(configType, configDir) {
    Config.apply(this, arguments);
}
ConfigModify.prototype = Object.create(Config.prototype, 
    {constructor: {value: ConfigModify}}); // thanks Felix
ConfigModify.prototype.write = function() { this.modify(); /* now write */ };

module.exports.A = _.curry(ConfigModify)('A');
module.exports.B = _.curry(ConfigModify)('B');
module.exports.C = _.curry(Config)('C');

根据世界着名的计算机科学家的说法,if语句只是一个执行不佳的子类。特别是如果它正在测试布尔标志。"