Javascript static/singelton - this vs _this vs object name



这是一个关于性能和最佳实践的问题。

假设我有一个js对象,它封装了大量的helper方法。该对象被视为一个静态类,这意味着它从未被实例化,并且它的所有方法基本上都是辅助方法。当使用events和jQuery时,对象的this作用域不断变化,由于它有相当多的方法,我想知道什么是最佳实践——在每个方法的开头将this保存到_this中,或者只使用对象名称MyObject

多年来,当涉及到单对象/静态对象时,我一直在做这两件事,但我认为必须只有一个最佳实践,现在是时候采用最佳方法了。

我目前的研究表明,使用_this而不是直接调用MyObject的好处主要有以下两个:

  • 如果对象的名称发生更改,_this将始终有效
  • 可能会更快(尽管还没有看到性能测试结果),因为浏览器保持在同一范围内,不需要每次都找出MyObject的范围

使用MyObject:的优点

  • 编写的代码更少
  • 垃圾收集管理?(要分配的变量较少)
  • 对于某些开发人员来说可能更具可读性(适用多个this
  • 由于MyObject将始终有效,因此更容易重构代码

我想知道是否有一种全局保存_this的方法(当然只在对象的范围内),并避免在每个方法的开头分配它。如果没有-是否还有我遗漏的其他优点/缺点,或者直接调用对象名称是否被认为是不好的做法。

这是一个可供参考的简化对象(实际对象有更多方法)。

    var MyObject = {
       init: function() {
         this.registerEvents();
         //other stuff
       },
       registerEvents: function() {
         this.registerOnSomeEvent();
         //registering more events..
         //...
       },
       registerOnSomeEvent: function() {
          var _this = this;
          jQuery('#someid').click(function() {
             _this.doSomething();//option 1
             MyObject.doSomething();//option 2
          });
       },
       doSomething: function() {
         //doing something...
       }
    }
MyObject.init();

谢谢你的帮助!

您可以将整个对象封装在一个闭包中以实现这一点,而无需在每个函数上指定_this

window.MyObject = (function () {
    var self = {
        init: function() {
            self.registerEvents();
            //other stuff
        },
        registerEvents: function() {
            self.registerOnSomeEvent();
            //registering more events..
            //...
        },
        registerOnSomeEvent: function() {
            jQuery('#someid').click(function() {
                self.doSomething();//option 1
                self.doSomething();//option 2
            });
        },
        doSomething: function() {
            //doing something...
        }
    };
    self.init();
    return self;
})();

我认为你的问题是,你要花很长的时间来精心模仿你应该做的事情。

const mySingleton = (function () {
    // Instance stores a reference to the Singleton 
    var instance;
    function init() {
        // Singleton
        // Private methods and variables
        var privateVariable = "Im also private";
        var privateRandomNumber = Math.random();
        return {
            // Public methods and variables
            publicMethod: function () {
                console.log( "The public can see me!" );
            },
            publicProperty: "I am also public",
            get randomNumber() {
                return privateRandomNumber;
            }
         };
         function privateMethod(){
            console.log( "I am private" );
         }
     };
     return {
         // Get the Singleton instance if one exists
         // or create one if it doesn't
         get instance() {
             if ( !instance ) instance = init();
             return instance;
         }
     };   
})();

如果你不想使用this上下文,永远不要使用继承,永远不要有多个实例,只是不要把这些东西写为对象上的方法,而是在单例模式中声明的私有方法(这是一个揭示模块模式,但只有一个实例)

因为事实上,你基本上就是这样做的,但你暴露了一切,你毫无目的地向this发送了成百上千次垃圾邮件。this在设计上不是一个常数。不要这样使用它。

最新更新