繁体   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