Javascript static/singelton - 这与vs _this vs对象名称

dev*_*ev7 4 javascript oop jquery encapsulation this

这是关于性能和最佳实践的问题.

假设我有一个封装了大量辅助方法的js对象.该对象被视为静态类,这意味着它永远不会被实例化,并且它的所有方法基本上都是辅助方法.当使用事件和jQuery,该对象的this范围不断变化,并且由于它有相当多的我想知道的方法什么是最好的做法-节能this_this在每个方法的开头或简单地使用对象名称MyObject.

多年来,我一直在做两件事,当涉及到singelton /静态物体时,但我认为必须有一个最佳实践,而且是采用最佳方法的时候了.

我目前的研究表明,使用_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();
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!

Est*_*lix 5

您可以将整个对象封装在闭包中以实现此目的,而无需_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;
})();
Run Code Online (Sandbox Code Playgroud)