如何从不同对象访问属性?

时间:2017-04-17 15:51:59

标签: javascript oop object

我是对象和OOP的新手,我想知道,如何获取对象名称以及是否有另一种访问对象属性的方法,除了我在下面描述的那个。

好的,让我们举个例子:

PSP0101

控制台将返回指向的对象,在本例中为“Window”

function giveMeSomeName() {
    console.log(this)
};

giveMeSomeName();

控制台将返回指向的对象,在本例中为“对象”

  1. 在这种情况下,引用对象将是“myObject”。假设我没有这些信息,我只有控制台告诉我,这个指向一个对象。有没有办法得到这个指向的对象的确切名称(在这种情况下我会寻找“myObject”)?
  2. 让我们继续我的第二个问题并将第二个代码片段扩展一行(this.age =“20”):

    var myObject = {
        giveMeSomeName: function() {
            console.log(this)
        }
    }
    

    如果我想在另一个上下文中访问或操作“age”在这种情况下,我会使用“myObject.age + = 1”作为示例,它会将对象“myObject”的属性“age”更改为21 。

    1. 在语法方面还有另一种方式来访问“年龄”吗? this.age 不会工作,因为这指向“Window”而不是“myObject”(其中“age”未定义)。你可能已经意识到这个问题与第一个问题有关。
    2. 并且具体

      我有以下代码。我怎么能在“enemyMovement()”函数中访问“敌人” (以下代码中的底线)?

      var myObject = {
          giveMeSomeName: function() {
              console.log(this)
              this.age = "20"
          }
      }
      

      谢谢:)

2 个答案:

答案 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();
}