我认为最好的方法可能是将 Helper IIFE 变成带有原型的“类”,但我有点赶时间......
我预计不会花很长时间。
我在想我可以只获取函数而不立即执行它,然后以某种方式将该函数存储到原型函数中并以这种方式使用它。
寻找有关如何以最少的代码更改最好地做到这一点的想法。
类模式只是 JavaScript 中的一种模式,您可以将 Helper 用作其他对象的原型,这符合您的“最小更改”要求。只需使用Object.create:
var helper1 = Object.create(Helper);
helper1.init(el);
var helper2 = Object.create(Helper);
helper2.init(el2);
var helper3 = Object.create(Helper);
helper3.init(el3);
// ...
helper1.doStuff();
helper2.doStuff();
helper3.doStuff();
如果你在init的末尾加上return this;,那就更简洁了:
var helper1 = Object.create(Helper).init(el);
var helper2 = Object.create(Helper).init(el2);
var helper3 = Object.create(Helper).init(el3);
// ...
helper1.doStuff();
helper2.doStuff();
helper3.doStuff();
现场示例:
var Helper = (function () {
return {
el: null,
init: function(el) {
this.el = el;
return this;
},
doStuff: function(){
this.el.style.color = "green";
this.el.style.fontWeight = "bold";
}
};
}());
var helper1 = Object.create(Helper).init(document.getElementById("el1"));
var helper2 = Object.create(Helper).init(document.getElementById("el2"));
var helper3 = Object.create(Helper).init(document.getElementById("el3"));
// ...
setTimeout(function() {
helper1.doStuff();
}, 400);
setTimeout(function() {
helper2.doStuff();
}, 800);
setTimeout(function() {
helper3.doStuff();
}, 1200);
<div id="el1">el1</div>
<div id="el2">el2</div>
<div id="el3">el3</div>
您甚至可以继续在第一个 el 上直接使用 Helper,进一步减少代码更改,尽管我不推荐这样做。
或者,将它包装在一个返回它的函数中(这里我还包括对init的更改):
function getHelper() {
var Helper = (function () {
return {
el: null,
init: function(el) {
this.el = el;
return this; // <============== Added
},
doStuff: function(){
// Modify this.el in someway
}
};
}());
return Helper;
}
那么对于你需要的三个地方:
var helper1 = getHelper().init(el);
var helper2 = getHelper().init(el2);
var helper3 = getHelper().init(el2);
// ...
helper1.doStuff();
helper2.doStuff();
helper3.doStuff();
旁注:无论如何,您都不需要 IIFE,除非您在其中包含未在对象初始化程序之外显示的内容...