这是一个关于性能和最佳实践的问题。
假设我有一个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
在设计上不是一个常数。不要这样使用它。