javascript - Javascript 变量作为函数名
问题描述
const self = {
element: document.querySelector(selector),
html: () => self.element,
on: (event, callback) => {
self.element.addEventListener(event, callback);
},
style: {
alignContent: (property) => {
return (property === null) ? self.element.style.alignContent : self.element.style.alignContent = property;
}
}
}
我正在努力做到这一点,因此我可以使用 jQuery 之类的选择器快速访问所有 CSS 样式属性,它应该可以作为:select('h1').style.alignContent('center')
,但问题是我必须为每个样式属性创建一个单独的函数才能使此方法起作用,有没有办法在不重复大量代码的情况下解决这个问题?
//Duplication example
color: (property) => {
return (property === null) ? self.element.style.color : self.element.style.color = property;
}
解决方案
一种方法是使用Proxy
(mdn):
let elemWrapper = selector => {
let element = document.querySelector(selector);
return {
element,
html: () => element,
on: (event, callback) => {
element.addEventListener(event, callback);
},
style: new Proxy({}, {
get: (obj, prop) => {
// The user called a function named "prop"
// We need to return a function that sets the style property named "prop"
return cssValue => element.style[prop] = cssValue;
}
})
};
};
let bodyElem = elemWrapper('body');
bodyElem.style.backgroundColor('cyan');
为了证明这个概念,我body
使用动态命名的函数设置了元素的背景颜色。
这种方法的最大缺点是代理的性能不佳(这里有关于代理性能的优秀读物)。
这意味着简单地编译所有 css 属性名称的列表并为每个属性名称定义一个函数可能会更快(从不使用代理)。以下代码编译所有 css 属性名称,作为起点:
console.log(Object.keys(document.body.style));
推荐阅读
- iframe - 替代 iframe 来制作分屏管理区域
- android - Android:Proguard 构建在 joda 时间失败
- python - 从 Jupyter NB 更改为 Python 文件时,通过 Python 脚本中断自动调整 Excel 列
- python - Investpy:传递股票代码并在回报中收到ISIN
- r - 将具有相同日期的特定行添加到数据框中
- sql - PostgreSQL 问题 - 按州查找销售额总和
- redis - 如何刷新过期键的 Redis 键空间?
- html - 间歇性 iOS 14 Safari 文本修改
- html - 使用变量将图片文件插入到 .HTMLBody 中的文本中
- mobile - 如何使用刷新令牌抓取网址?