1

我有这张图片的代码

var img = {
    id: id++,
    link: m.attr("index"),
    x: m.offsetx(),
    y: m.offsety(),
    width: m.width(),
    height: m.height()
};

现在我想调用一个函数img.setCordinates(x,y)and img.setDimention(w,h),但我不想将它们添加到img对象中,因为我将有很多img对象,它们将被保存并加载到文件中。函数的作用无关紧要,我只是想知道它们是如何实现的?

我还应该提到这一点,我需要做这些功能的原因是因为这个代码示例问题:(不好)

arr.getById(index).x = 100;
arr.getById(index).y = 200;

.getById()是数组的直接原型,它循环真正的 arr 并查找指定的 id。

4

3 回答 3

7

您应该为此启动一个新的原型链:

function MyImage(data)
{
    // copy data into this instance
    for (var key in data) {
        this[key] = data[key]; // assume that data is anonymous object
    }
}

MyImage.prototype.setCoordinates = function(x, y) {
    this.x = x;
    this.y = y;
}

MyImage.prototype.setDimensions = function(width, height) {
    this.width = width;
    this.height = height;
}
// etc.

然后你可以像这样创建一个新图像:

var img = new MyImage({
    id: id++,
    link: m.attr("index"),
    x: m.offsetx(),
    y: m.offsety(),
    width: m.width(),
    height: m.height()
});

img.setCoordinates(0, 0);

更新

似乎如果我使用 JSON.stringify( arr of MyImage ) 重新加载时它将不起作用。

那是因为 JSON 序列化数据,而不是方法或函数。如果你想恢复一个MyImage对象数组,你应该这样做:

var images = JSON.parse(data).map(function(image) {
    return new MyImage(image);
});

匿名函数将解析后的数据映射到一个MyImage对象中,并将其应用于复活数组的每个元素。

于 2013-05-14T13:41:49.953 回答
0

如果我了解您想要做什么,这将img仅在实例化/创建对象时添加您在每个对象上请求的功能。

img.prototype.setCoordinates = function(x, y) {
    this.x = x;
    this.y = y;
}

img.prototype.setDimension = function(w, h) {
    this.width = w;
    this.height = h;
}

这是一种节省一些内存空间的方法。这可以工作。

于 2013-05-14T13:37:33.767 回答
0

据我了解,没有办法实现img.setCoordinates(x,y)img.setDimension(w,h)正如你所定义的那样。“img”是一个对象。添加“img”。任何东西都会将它添加到 img 对象中。如果您不想将内部方法添加到“img”对象,为什么不这样做:

setCoordinates(img.x, img.y){ do your stuff in here}

setDimension(img.width, img.height){ do more stuff here}
于 2013-05-14T13:43:35.700 回答