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

时间:2012-08-18 00:35:23

标签: javascript

我想在JavaScript中实现这一点:

function changeAttributeValue(theAttribute, numberOfPixels)
{
    theAttribute = numberOfPixels + "px";
}

changeAttributeValue(myImage.style.left, 50);
changeAttributeValue(myImage.style.top, 80);
changeAttributeValue(myCanvas.width, 600);

前两个调用应移动图像,第三个调整应调整画布的宽度。

但是这样,只传递了传递的变量的,所以没有任何反应。

有人知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

你可以这样做。

function changeAttributeValue(obj, propName, numberOfPixels) {
    obj[propName] = numberOfPixels + "px";
}

changeAttributeValue(myImage.style, "left", 50);
changeAttributeValue(myImage.style, "top", 80);
changeAttributeValue(myCanvas, "width", 600);

答案 1 :(得分:3)

嗯,这是我的“解决方案”。

它的灵感来自Jared Farrish的评论。也就是说,这会为可以使用的属性访问创建一个“包装器”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)

理论是合理的,但代码是未经测试的。因人而异。 : - )

答案 2 :(得分:2)

如果我实际发布并评论我在评论中提供的内容,这可能很有用。

即便:

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() is used多少。如果你“得到”它们,这两种方法真的很有用。