对象Javascript的实例很少

时间:2013-12-01 14:37:22

标签: javascript

我想创建一个这个类的实例

var fruit = {
    texture: new Image(),
    speed: 5,
    x: 0,
    y: 0,
};
function fruits(speed, x, y) 
{
    fruit.speed = speed;
    fruit.x = x;
    fruit.y = y;
    return fruit;
};

但是当我创建新对象时,所有值都被最后创建的对象覆盖。我怎么修这个? 我的循环:

var apples = [];

for(var i = 0; i < 10; i++)
{
    apples[i] = new fruits(5, Math.floor((Math.random()*775)+1), 0);
    apples[i].texture.src = "_img/apple.png";
}

5 个答案:

答案 0 :(得分:2)

function Fruit( speed, x, y ){
    var fruit = {};   // or use some base object instead of {}

    fruit.texture = new Image();
    fruit.speed   = speed || 5;
    fruit.x       = x || 0;
    fruit.y       = y || 0;

    return fruit;
};

var apples = [];

for( var i=0; i<10; i++ ){        
    apples[i] = Fruit( 5, Math.floor((Math.random()*775)+1), 0 );
    apples[i].texture.src = "_img/apple.png";
}

Douglas Crockford - Power Constructor, 'new', 'this' and more

答案 1 :(得分:2)

这里出现的其他答案都很奇怪。这是解决方案:

function fruits(speed, x, y) 
{
    this.texture = new Image( );
    this.speed = speed;
    this.x = x;
    this.y = y;
};

请注意,关键字this用于设置属性。这意味着当你打电话

var apple = new fruits( blah blah );

然后apple将设置为具有texturespeedxy属性的新对象。没有必要引用一些全局对象来存储它们;它们存储在新创建的对象中。

我也会重命名;惯例是使用单数名称和对象的大写首字母,因此Fruit会更有意义(允许new Fruit(...)

答案 2 :(得分:1)

你有一个对象:

var fruit = {
    texture: new Image(),
    speed: 5,
    x: 0,
    y: 0, // Note the superflous comma, which might break the code in some IE versions
};

这里有一个功能:

function fruits(speed, x, y)  {
    fruit.speed = speed;
    fruit.x = x;
    fruit.y = y;
    return fruit;
};

该函数在调用时会修改上述对象并返回它。

现在,你想要的是一个构造函数,但你在这里没有。

这将是新Fruit

的构造函数
function Fruit(speed, x, y) {
    this.texture = new Image();
    this.speed = speed || 5; // Note: Using logical OR to emulate default values for the argument
    this.x = x || 0;
    this.y = y || 0;

    // Note: There is no return here!
}

var a = new Fruit(2, 1, 10);
var b = new Fruit(4, 10, 20);
a === b; // Returns false, you got two instances :)

new可能具有能够创建Function实例的功能,但您仍然可以通过在constructor函数内手动返回来覆盖此行为。

此外,即使您在原始代码中遗漏了return fruit,也会返回fruits的空实例,因为您没有为新创建的实例分配任何属性。

在我的Fruit示例中,我通过instance object关键字引用this,因此我可以指定speedimagexy为每个创建的实例。

您可能还想阅读:

答案 3 :(得分:0)

function fruits(speed, x, y) {
    return {
        texture: new Image(),
        speed: speed,
        x: x,
        y: x,
    }
};

答案 4 :(得分:0)

尝试这样的构造函数:

function Fruit(speed, x, y) {
    return {
        speed: speed,
        x: x,
        y: y
    }
}

alert(new Fruit("mySpeed", 1, 2).speed);