代码之家  ›  专栏  ›  技术社区  ›  Yichz

javascript es6模块变量vs静态

  •  3
  • Yichz  · 技术社区  · 8 年前

    假设我们有这两个类,假设 doSomething 不需要 this 通道我能看到的唯一区别是,模块“更私密”,还有其他东西吗?

    示例1.js

    class Sample1 extends React.Component {
        static doSomething(input) {
            // ...
            return input2;
        }
    
        render() {
            if (Sample1.doSomething(x)) {
                return <div />;
            }
            return null;
        }
    }
    export { Sample1 };
    

    示例2.js

    const doSomething = (input) => {
        // ...
        return input2;
    };
    
    class Sample2 extends React.Component {
        render() {
            if (doSomething(x)) {
                return <div />;
            }
            return null;
        }
    }
    export { Sample2 };
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   elbecita    8 年前

    在样本1中 doSomething 已公开,您可以使用 Sample1.doSomething() ,但在Sample2场景中,该方法在模块范围之外不可用,所以是的,它是私有的。

    现在,关于内存消耗,无论您创建了多少个实例,静态方法只分配一次,并且只能通过类而不是实例访问。

    这对你有意义吗?

        2
  •  0
  •   Estus Flask    8 年前

    唯一的区别是可测试性。当函数作为如下方法调用时 Sample1.doSomething(x) ,它可以在测试过程中被窥视或存根。

    一种更具扩展性的方法是引用静态方法,如 this.constructor.doSomething(x) . 在这种情况下,可以在子类中扩展该方法。

    如果该方法仅在类实例中使用,而从不作为静态调用(如在React组件中),那么将其设为静态是没有意义的。它可以定义为原型方法,并可以这样调用 this.doSomething(x) .