[英]How to do class free inheritance in JavaScript (Crockford style)
我正在努力提高我的JS技能,並且我正在觀察JS世界中的一些重要實體。 這樣的實體是道格拉斯·克羅克福德,他正在宣傳一個免費的范式。
在Nordic js觀看他之后(我強烈推薦)我對他制作物品的方式感到困惑,沒有任何分類法。
我現在正試圖將他的幻燈片復制到一個使用例外的簡單示例中,但我無法讓它正常工作。
我不明白我的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
等關鍵字。
為此,您需要使用Destructuring assign pattern 。 使用此模式,幻燈片中的以下代碼:
function animal(spec) {
let {body, type, name} = spec;
}
將轉換為以下內容:
function animal(spec) {
let body = spec.body;
let type = spec.type;
let name = spec.name;
}
這實際上是工廠模式的ECMA6版本,如本博客構建器VS工廠中所述 。
考慮到這一點,我們現在可以轉到代碼。
index.js
"use strict";
let _ = require("underscore");
let Exception = require("./Exceptions/Exception.js");
let UniformityException = require("./Exceptions/UniformityException.js");
let jsonParams = {
outputFolder: "./ErrorLogs/",
fileExtension: ".txt",
message: {info: "A generic error ocurred."},
exceptionName: "Exception",
};
let myException = Exception(jsonParams);
myException.write();
jsonParams.fileExtension = ".json";
jsonParams.exceptionName = "UniformException";
jsonParams.outputFileName = jsonParams.exceptionName + "_" + _.now();
let myUniformException = UniformityException(jsonParams);
myUniformException.write({
fruit: "banana"
});
Exception.js
"use strict";
let jsonfile = require("jsonfile");
let _ = require("underscore");
let Exception = function(args) {
let {
outputFolder,
fileExtension,
exceptionName,
message,
outputFileName,
} = args;
outputFileName = outputFileName|| (exceptionName + "_" + _.now());
let filePath = outputFolder + outputFileName + fileExtension;
let write = function() {
jsonfile.writeFile(filePath, message, error => {
if (!_.isNull(error) && !_.isUndefined(error))
console.log(error);
});
};
return Object.freeze({
filePath,
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 {filePath} = Exception(args),
write = function(info) {
jsonfile.writeFile(filePath, info, error => {
if (!_.isNull(error) && !_.isUndefined(error))
console.log(error);
});
};
return Object.freeze({
filePath,
write
});
};
module.exports = UniformityException;
我想指出的一點是,你的工廠函數應該都以小寫字母 ( function animal
) 開頭 ,並且可以遵循camelCase約定並將其命名為' animalConstructor()
'。
通常,按照慣例,需要使用new
構造函數是帶有第一個大寫字母的名稱( function Animal
)。 為避免將來出現混淆,您應該重命名例外。
我強烈推薦的另一個資源來自邪惡帝國:
在我看來,這是對Crockford工廠職能的准確解釋。
希望它有所幫助!
您只能“重用”由Exception
重新調整的內容。 即如果你想直接訪問props
,你需要暴露它。 沒有其他辦法了。
這實際上與您在其他基於類的語言中找到的可見性模型一致:私有成員(例如, props
)只能由類本身訪問。 如果子類應該具有訪問權限,則許多語言提供“受保護”模式,但JS沒有類似的東西。
您可以考慮使Exception
接受一個將其“私有”成員傳遞給它的函數,而不是將它添加到函數返回的對象中,就像Promise
一樣。 不知道Crockford對此有何看法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.