gpt4 book ai didi

Javascript:扩展函数

转载 作者:IT王子 更新时间:2023-10-29 02:46:07 27 4
gpt4 key购买 nike

我想要它的主要原因是我想扩展我的初始化函数。

像这样:

// main.js

window.onload = init();
function init(){
doSomething();
}

// extend.js

function extends init(){
doSomethingHereToo();
}

所以我想像扩展 PHP 中的类一样扩展一个函数。

我也想从其他文件扩展它,所以例如我在 main.js 中有原始的 init 函数,在 extended.js 中有扩展函数.

最佳答案

通过更广泛地了解您实际尝试做的事情以及您做这件事的背景,我相信我们可以为您提供比字面答案更好的答案你的问题。

但这是一个字面的答案:

如果您将这些函数分配给某处的某个属性,您可以包装原始函数并将替换函数放在该属性上:

// Original code in main.js
var theProperty = init;

function init(){
doSomething();
}

// Extending it by replacing and wrapping, in extended.js
theProperty = (function(old) {
function extendsInit() {
old();
doSomething();
}

return extendsInit;
})(theProperty);

如果您的函数尚未在某个对象上,您可能希望将它们放在那里以促进上述操作。例如:

// In main.js
var MyLibrary = {
init: function init() {
}
};

// In extended.js
(function() {
var oldInit = MyLibrary.init;
MyLibrary.init = extendedInit;
function extendedInit() {
oldInit.call(MyLibrary); // Use #call in case `init` uses `this`
doSomething();
}
})();

但是有更好的方法可以做到这一点。例如,提供一种注册 init 函数的方法。

// In main.js
var MyLibrary = (function() {
var initFunctions = [];
return {
init: function init() {
var fns = initFunctions;
initFunctions = undefined;
for (var index = 0; index < fns.length; ++index) {
try { fns[index](); } catch (e) { }
}
},
addInitFunction: function addInitFunction(fn) {
if (initFunctions) {
// Init hasn't run yet, remember it
initFunctions.push(fn);
} else {
// `init` has already run, call it almost immediately
// but *asynchronously* (so the caller never sees the
// call synchronously)
setTimeout(fn, 0);
}
}
};
})();

这里是 2020 年(或者实际上是 ~2016 年之后的任何时间),可以写得更紧凑一些:

// In main.js
const MyLibrary = (() => {
let initFunctions = [];
return {
init() {
const fns = initFunctions;
initFunctions = undefined;
for (const fn of fns) {
try { fn(); } catch (e) { }
}
},
addInitFunction(fn) {
if (initFunctions) {
// Init hasn't run yet, remember it
initFunctions.push(fn);
} else {
// `init` has already run, call it almost immediately
// but *asynchronously* (so the caller never sees the
// call synchronously)
setTimeout(fn, 0);
// Or: `Promise.resolve().then(() => fn());`
// (Not `.then(fn)` just to avoid passing it an argument)
}
}
};
})();

关于Javascript:扩展函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4578424/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com