传递属性,而不是值作为参数
Pass attribute, not value as parameter
我想在JavaScript:中实现这一点
function changeAttributeValue(theAttribute, numberOfPixels)
{
theAttribute = numberOfPixels + "px";
}
changeAttributeValue(myImage.style.left, 50);
changeAttributeValue(myImage.style.top, 80);
changeAttributeValue(myCanvas.width, 600);
前两个调用应该移动图像,第三个调用应该调整画布的宽度。
然而,与此类似,只传递了传递变量的值,因此不会发生任何事情。
有人知道如何解决这个问题吗?
您可以这样做。
function changeAttributeValue(obj, propName, numberOfPixels) {
obj[propName] = numberOfPixels + "px";
}
changeAttributeValue(myImage.style, "left", 50);
changeAttributeValue(myImage.style, "top", 80);
changeAttributeValue(myCanvas, "width", 600);
好吧,这是我的"解决方案"。
它的灵感来自杰瑞德·法里什的评论。也就是说,这为可以使用的属性访问创建了一个"包装器"getter/setter函数。我不建议在这里使用它(因为它比所需的更复杂),但它可以在其他地方用于一些很棒的东西。
function mkAccessor(obj, attribute) {
return function (value) {
if (arguments.length > 0) {
obj[attribute] = value
}
return obj[attribute]
}
}
function changeAttribute (accessor, value) {
accessor(value)
}
changeAttribute(mkAccessor(myImage.style, "top"), 50)
changeAttribute(mkAccessor(myImage.style, "left"), 80)
var canvasWidthAccessor = mkAccessor(myCanvas, "width")
// somewhere later on
changeAttribute(canvasWidthAccessor, 600)
// or just
canvasWidthAccessor(600)
理论是合理的,但代码是未经测试的。YMMV.:-)
如果我真的发布并评论我在评论中提供的内容,这可能会很有用。
也就是说:
function setDim(attr, modifier, pix) {
if (!modifier) {
this[attr] = pix + 'px';
} else {
this[attr][modifier] = pix + 'px';
}
}
现在,这是如何工作的?this
引用范围。如果你直接叫它:
setDim('style', 'width', 50);
这将简单地调用window
或global
作用域。实际上,这是为使用el.call()
或el.apply()
传递作用域而构建的,大致相同,只是取决于您希望参数如何传递到函数中。
你真正想怎么称呼它:
// Gives you the scope of the element #test1
var test = document.getElementById('test1');
然后可以"称"为:
setDim.call(test, 'style', 'width', 50);
注意,如果它只是一个属性(简单明了),则传递null
:
setDim.call(test, 'width', null, 50);
我在这个小提琴中使用setTimeout()
来达到效果,但不需要:
http://jsfiddle.net/userdude/tCz6j/2/
通过jQuery核心源代码查看.apply()
的使用量。如果你"得到"了这两种方法,那么真的很有用。
相关文章:
- 传递属性,而不是值作为参数
- 无法在
标记 SRC 属性中传递参数
- 将对象作为参数传递后的未定义属性
- 如何检索其属性为给定参数的子字符串的所有文档
- Ember使用参数计算属性
- Web Api 2属性路由和Angular JS参数
- 在 Javascript 中传递对象属性键,而不是其值作为参数
- Javascript:如何通过其参数选择函数内部属性
- InDesign CS5 / Extendscript -- exportFile 的参数是什么,它的相关属性是什么
- 嵌套属性作为函数参数
- 将属性作为参数从主干模型传递到 Spring 控制器
- 从 JavaScript 对象获取值,如果属性的前 8 位数字与参数匹配
- 如何将 GET 参数分配给 HTML 输入文本的值属性
- 可更改的属性作为 jQuery 插件中的参数
- 对象属性来自方法参数时未定义
- 支持流星和铁路由器中具有嵌套属性的多个参数
- 如何在 DOM 对象上设置属性时避免无参数重新分配
- JavaScript函数长度和参数属性/字段
- 具有开放端构造函数参数的参数属性声明
- 如何将参数属性分配给self