【发布时间】:2017-07-02 17:40:07
【问题描述】:
背景
我正在努力提高我的 JS 技能,并且我正在关注 JS 世界中的一些大型实体。这样的实体就是道格拉斯·克罗克福德(Douglas Crockford),他正在宣扬一种无阶级的范式。
在 Nordic js(我强烈推荐)看过他之后,我对他 makes objects 没有任何分类的方式感到困惑。
问题
我现在尝试将他的幻灯片复制到一个使用异常的简单示例中,但我无法使其正常工作。
我不明白我的 UniformityException.js 文件如何重用来自 Exception.js 的代码并与 Crockford 的意识形态保持一致。
这里的问题是我在UniformityException.js 中的specs 变量只有一个write 方法,这是理所当然的。
看了很多次幻灯片,不大量使用Object.assign,我无法理解如何更改此代码。
代码
Exception.js
"use strict";
let jsonfile = require("jsonfile");
let _ = require("underscore");
let Exception = function(args){
let DEFAULT_PROPS = {
exceptionName: "Exception",
outputFolder: "./ErrorLogs/",
fileExtension: ".txt"
};
DEFAULT_PROPS.message = "A generic exception occurred.";
DEFAULT_PROPS.outputFile = DEFAULT_PROPS.exceptionName + "_" + _.now();
let props = Object.assign(DEFAULT_PROPS, args);
let write = function(){
jsonfile.writeFile(props.outputFolder + props.outputFile + props.fileExtension, props.message, error => {
if(_.isNull(error) || _.isUndefined(error))
console.log(error);
});
};
return Object.freeze({
write
});
};
module.exports = Exception;
UniformityException.js
"use strict";
let Exception = require("./Exception.js");
let jsonfile = require("jsonfile");
let _ = require("underscore");
let UniformityException = function(args){
let specs = Exception({
exceptionName: "UniformityException",
fileExtension: ".json"
});
let write = function(info){
jsonfile.writeFile(specs.outputFolder + specs.outputFile, info, error => {
if(_.isNull(error) || _.isUndefined(error))
console.log(error);
});
};
return Object.freeze({
write
});
};
module.exports = UniformityException;
index.js
"use strict";
let UniformityException = require("./Exceptions/UniformityException.js");
let myUniformException = UniformityException();
myUniformException.write({fruit: "banana"});
问题
- 如何让
UniformityException.js以符合 Crockford 风格的方式重复使用来自Exception.js的代码?
像往常一样,应避免使用 new、this 和 Object.create 等关键字。
【问题讨论】:
-
你想重用哪一部分?
write函数? -
一切。但在这种情况下,我想重用
Exception.js中的props变量 -
不能使用上面的代码,因为
Expection暴露的唯一属性是write。props是其构造函数中的私有变量。如果您希望该部分公开可用,则必须将其添加到返回(冻结)对象中。 -
“没有任何分类法” - 这不是真的。出于某种原因,他只是不使用原型继承。他的函数(我敢称它们为类吗?)确实有一个层次结构。在您的情况下,
UniformityException不能扩展Exception,因为它的write方法不可重用。 -
我不明白为什么公开
props应该违反伟大的 Crockford 的“不可或缺”的法律。这基本上就是{other} = other_constructor(spec)在他的幻灯片中所做的。 附带说明: 有很多人不服从“JS 教父”,但仍然是伟大的开发者!过于教条不会让你成为任何语言的更好的开发者:)
标签: javascript node.js class ecmascript-6