我有以下节点模块:
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。
有谁知道这个问题的优雅解决方案?
答案 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
语句只是一个执行不佳的子类。特别是如果它正在测试布尔标志。"