簡體   English   中英

如何在JavaScript中進行類自由繼承(Crockford風格)

[英]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"});

問題

  1. 如何使UniformityException.js以適合Crockford風格的方式重用Exception.js中的代碼?

像往常一樣,要避免使用newthisObject.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM