我是对象和OOP的新手,我想知道,如何获取对象名称以及是否有另一种访问对象属性的方法,除了我在下面描述的那个。
好的,让我们举个例子:
PSP0101
控制台将返回指向的对象,在本例中为“Window”
function giveMeSomeName() {
console.log(this)
};
giveMeSomeName();
控制台将返回指向的对象,在本例中为“对象”
让我们继续我的第二个问题并将第二个代码片段扩展一行(this.age =“20”):
var myObject = {
giveMeSomeName: function() {
console.log(this)
}
}
如果我想在另一个上下文中访问或操作“age”在这种情况下,我会使用“myObject.age + = 1”作为示例,它会将对象“myObject”的属性“age”更改为21 。
并且具体:
我有以下代码。我怎么能在“enemyMovement()”函数中访问“敌人” (以下代码中的底线)?
var myObject = {
giveMeSomeName: function() {
console.log(this)
this.age = "20"
}
}
谢谢:)
答案 0 :(得分:2)
当使用函数作为对象的基础时,您需要将该函数用作“构造函数”,这意味着您使用new
关键字对其进行实例化。执行此操作后,函数中this
关键字的使用会导致该单词绑定到实例化期间创建的对象变量。这是您创建实例属性的方法。所以:
// This funciton is intended to be used to construct distinct instances of objects
// Notice that the name is written in Pascal Case to alert others of this fact.
function GiveMeSomeName(input) {
this.myProp = input;
console.log(this.myProp)
};
// When using a constructor function, use the `new` keyword to generate the instance
// and capture the resulting object in a variable to keep each instance separate from
// the next.
var myObjectInstance1 = new GiveMeSomeName("foo");
var myObjectInstance2 = new GiveMeSomeName("foo2");
将创建对象的两个单独实例,每个实例都有不同的数据存储在自己的实例属性中。
此外,按照惯例,应该使用Pascal Case(以大写字母开头)命名要作为构造函数调用的函数,让其他人知道应该使用new
调用它并且它将返回一个实例。
对于您的特定游戏代码,应该封装自己的数据和行为的游戏的每个元素都应该是一个对象,所以这段代码:
function create() {
game.stage.backgroundColor = '#3598db'
game.physics.startSystem(Phaser.Physics.ARCADE);
game.world.enableBody = true;
this.cursor = game.input.keyboard.createCursorKeys();
this.tank = game.add.image(200, 75, 'tank')
this.enemy = game.add.image(0, 0, 'tankEnemy')
}
应该是构造函数(并使用new
调用),或者它本身应该创建一个新对象并返回该对象(就像工厂函数一样)。这是一个例子:
// This will be a factory function that creates and returns an object instance
function createEnemy() {
game.stage.backgroundColor = '#3598db'
game.physics.startSystem(Phaser.Physics.ARCADE);
game.world.enableBody = true;
function Enemy(){
this.cursor = game.input.keyboard.createCursorKeys();
this.tank = game.add.image(200, 75, 'tank')
this.enemy = game.add.image(0, 0, 'tankEnemy')
}
// Create the instance and return it:
return new Enemy();
}
然后你只需得到敌人的对象并像这样使用它:
// Notice here we are NOT using the `new` keyword because the
// factory function is already doing that internally. We are just
// "catching" the resulting object that is returned from the factory.
var enemy1 = createEnemy();
enemy1.tank = ...
最后,因为所有这一切都取决于您,开发人员在记住使用new
关键字时,JavaScript现在包含 object.create()
方法,允许您传递将作为原型对象的对象,它返回一个新实例供您使用。
答案 1 :(得分:0)
一般情况下,我建议您更深入了解Prototypes。
在您的特定情况下,尝试扩展游戏'对象与敌人运动'功能:
game.enemyMovement = function() {
this.enemy.position.x += 3;
}
并更改'更新'功能:
...
this.enemyMovement();
}