传递属性,而不是值作为参数

Pass attribute, not value as parameter

本文关键字:参数 属性      更新时间:2023-09-26

我想在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);

这将简单地调用windowglobal作用域。实际上,这是为使用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()的使用量。如果你"得到"了这两种方法,那么真的很有用。