我想创建一个这个类的实例
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";
}
答案 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
将设置为具有texture
,speed
,x
和y
属性的新对象。没有必要引用一些全局对象来存储它们;它们存储在新创建的对象中。
我也会重命名;惯例是使用单数名称和对象的大写首字母,因此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
,因此我可以指定speed
,image
,x
和y
为每个创建的实例。
您可能还想阅读:
答案 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);