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

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

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

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

我目前的研究表明,使用_this而不是直接调用MyObject所带来的好处主要是这两个:

  • 如果对象的名称发生变化, _this将始终有效
  • 可能更快(虽然没有看到性能测试结果),因为浏览器保持在相同的范围内,并且不需要每次都找出MyObject的范围。

使用MyObject优点:

  • 少写代码。
  • 垃圾收集管理? (分配的变量较少)
  • 对于一些开发人员来说可能更具可读性(其中多个适用)
  • 因为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上下文,请永远不要使用inheritance,并且永远不要有多个实例,只是不要将这些内容写为对象上的方法,而是将单个模式中的声明私有方法(即揭示模块模式,但只有一个实例)

因为它本来就是你基本上做到的,但你揭示了一切,你完全没有任何目的地垃圾邮件数百次。 this 不是设计的常数 。 不要这样使用它。