如何在JavaScript中的工厂函数中处理公共和私有函数的继承?

时间:2015-11-09 02:02:17

标签: javascript inheritance

我是一组约8名开发人员的团队负责人。我们管理一个大型网站,它被分成许多“组件”(例如,一个组件可能是一个图库 - 除了库,这些'组件'是独立的)。我们正在分拆事情,部分任务是创建Gulp代码来处理每个组件的各个处理阶段(SCSS处理,连接,图像优化等)。

因此,我需要提出一个模式,团队可以在为新的“组件”创建Gulp代码时遵循该模式。我需要保持尽可能简单,因为许多开发人员都是Gulp的新手。我想要的一般想法是我们有一个基础Gulp'组件',它将拥有处理标准'组件'所需的所有代码,但我希望有一些'组件'需要特殊的gulp代码。因此,我希望能够在这些情况下扩展基本Gulp'组件'编译代码。

为了学习并为团队建立坚实的基础,我们一直在阅读有关JavaScript继承的最佳方法的一些内容。我对人们的感受方式遇到了很大的分歧。我考虑过哪些方法以及我收集了什么:

  1. 我可以在node.js中使用ES6中的类。这些类被JavaScript世界中的许多大牌以及过去的大牌(使用古典风格语言)所避免,原因是它鼓励使用脆弱的代码。此外,你不能做经典风格的公共和私人财产/功能,所以我很难找到任何真正的理由,为什么我应该这样做。

    如果我确实走了这条路,我觉得我最终会得到类似的东西(代码未经测试/可能不正确,我只是在抛弃我的想法):

    class Component {
        constructor(options) {
    
        },
        build() {
    
        },
        dev() {
    
        }
        test() {
    
        },
    
        // Should be private, but wont be
        _processStyles() {
    
        },
        _processScripts() {
    
        }
    }
    
  2. 工厂功能。我们习惯于使用这些模板模式,通常我喜欢它们。我也相信道格拉斯·克罗克福德是工厂职能的粉丝,所以我觉得我对此很好。现在,如果我创建公共和私有方法(通过返回仅引用我的公共函数的对象)然后我想扩展'component',在新工厂中我将创建一个'component'实例然后扩展它。问题是我无法覆盖(甚至调用)我的'组件'实例的私有函数,因为它们在我无法访问的不同范围内。我确实读到了解决这个问题的一种方法是使用一个对象来创建对所有私有方法的引用,但是它们不再是私有的,所以它会使对象失败(没有双关语)。

    var component = function(options) {
    
        var init = function() {
    
        };
        var build = function() {
    
        };
        var dev = function() {
    
        };
        var test = function() {
    
        };
        var _processStyles = function() {
    
        };
        var _processScripts = function() {
    
        };
    
        return {
            init: init,
            build: build,
            dev: dev,
            test: test
        };
    };
    
    var specialComponent = function(options) {
        // Create instance of component
        var cmp = component(options);
    
        // Extend it
        cmp.extraFunction = function() {
            // This will throw an error as this function is not in scope
            _processStyles();  
        }
    
        // Private functions are available if I need them
        var _extraPrivateFunction = function() {
    
        }
    
        return cmp;
    }
    
  3. 所以,我觉得我在某个地方错过了某些东西,比如我需要有人指出我正确的方向。我是否对私人功能感到过于担心(感觉就像这样)?有更好的方法吗?这样的东西怎么样,这似乎适合经典继承最好以干(不要重复自己)的方式解决?

    提前致谢, 亚历克斯。

0 个答案:

没有答案