代码之家  ›  专栏  ›  技术社区  ›  Herb Caudill

有没有理由偏爱私有类方法而不是非导出的helper函数?

  •  0
  • Herb Caudill  · 技术社区  · 7 年前

    // Pattern A
    
    export class Foo {
      constructor() {
        this.doSomething();
      }
      // private method
      private doSomething() {}
    }
    

    //Pattern B
    
    export class Foo {
      constructor() {
        doSomething();
      }
    }
    // non-exported function in module scope
    function doSomething() { }
    

    在一个全是Typescript代码库中,有没有一个实际的原因让你更喜欢这些模式中的一个而不是另一个?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jesse Hallett    7 年前

    我认为唯一重要的区别是私有方法可以通过 this ,而未报告的helper函数则没有。我对这两种模式都很满意。

    您已经注意到了这一点,但对于后代,我想指出的是,使用private方法的版本的编译输出:

    var Foo = /** @class */ (function () {
        function Foo() {
            this.doSomething();
        }
        // private method
        Foo.prototype.doSomething = function () { };
        return Foo;
    }());
    

    Typescript赋值 doSomething Foo 原型,这与实现公共方法的方式相同。“private”限制仅由Typescript在编译时强制执行。如果此代码与普通Javascript代码结合使用,JS代码将能够像调用公共方法一样轻松地调用私有方法。但在一个全打字的项目中,这并不重要。

    不使用Typescript时,通常通过在类构造函数中定义私有方法来实现它们。这将为每个实例创建一个新的方法副本,该副本将关闭构造函数中的变量,这可能会导致更高的内存使用。我认为理解Typescript不遵循这种模式是有用的。在Typescript中,私有方法与公共方法具有相同的性能特征。

        2
  •  1
  •   Nurbol Alpysbayev    7 年前

    模式B不是typescript方式,它更多的是javascript方式。

    在全类型脚本代码库中,我肯定更喜欢模式A,因为:

    • 它明确了开发商的意图
    • 它清楚地表明 doSomething 属于 Foo
    • 重构更容易,只需移动整个类,而不必研究应该移动哪些函数。
    • 剂量 功能上,它也会更容易,而不是捣乱 .bind()
    推荐文章