2017-04-17 6 views
1

私はオブジェクトとOOPの新しさを知りたいと思っていました。オブジェクト名を取得する方法と、オブジェクトのプロパティにアクセスする別の方法を知りたいと思っていました。異なるオブジェクトからプロパティにアクセスするにはどうすればよいですか?

さて、let'sこの例取る:この場合には、これは、を指すオブジェクトを、返され

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

giveMeSomeName(); 

コンソールを "ウィンドウ"

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

コンソール意志これが指し示すオブジェクト、この場合「オブジェクト」を返す

  1. この場合、参照するオブジェクトは "myObject"になります。私がこの情報を持っていないと仮定しましょう。私が持っているのはコンソールです。それはです。このはオブジェクトの方を指しています。オブジェクトの正確な名前を取得する方法はありますか(この場合、私は "myObject"を探しています)、を指していますか?

Let'sは私の2番目の質問に移動し、1つのライン(this.age =「20」)によって、第2のコードスニペットを拡張:

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

私がアクセスしたり、操作したい場合は、「年齢"別の文脈では、この場合、例えば" myObject.age + = 1 "とし、オブジェクト" myObject "のプロパティ" age "を21に変更します。

  1. 「年齢」にアクセスするための構文に関して別の方法がありますか? this.ageこれは "Window"を指し、 "myObject"(ここで "age"は未定義)を指していないので、これは機能しません。あなたはこの質問が最初のものと相関していることを理解しているかもしれません。

そしてコンクリートすべき:

私は、次のコードを持っています。関数「enemyMovement()」 (次のコードの一番下の行)で「敵」にアクセスするにはどうすればよいですか?

var game = new Phaser.Game(500, 200, Phaser.Auto, '', 
    { 
     preload: preload, 
     create: create, 
     update: update 
    } 
); 

function preload() { 
    game.load.image('tank', 'assets/tank.png') 
    game.load.image('tankEnemy', 'assets/tankEnemy.png') 
} 

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') 
} 

function update() { 
    if (this.cursor.left.isDown) { 
     this.tank.position.x -= 3; 
    } 
    else if (this.cursor.right.isDown) { 
     this.tank.position.x += 3; 
    } 
    else if (this.cursor.up.isDown) { 
     this.tank.position.y -= 3; 
    } 
    else if (this.cursor.down.isDown) { 
     this.tank.position.y += 3; 
    } 

    enemyMovement(); 
} 

function enemyMovement() { 
    enemy.position.x += 3; //how can I access 'enemy' from above? 
} 

感謝:)

+0

ちょうど "私のために自分で一つの可能​​な解決策を見つけた:

game.enemyMovement = function() { this.enemy.position.x += 3; } 

と変化する「更新」機能:あなたの特定のケースで

は「enemyMovement」機能を備えた「ゲーム」オブジェクトを拡張してみてください具体的な問題 "として、私は単に 'enemyMovement(this.enemy)'と呼んで、そのようにアクセスします。しかしこれにはより良い解決策がありますか?私の最初の2つの質問はまだあります:) – Faizy

+0

私は 'game.enemy'を使って問題を解決できると信じています...? – GSazheniuk

+0

JavaScriptのオブジェクトには、固有の「名前」がありません。オブジェクトを参照する可能性のある変数は、他のオブジェクトのプロパティと同様に名前を持ちます。同じ単一のオブジェクトは、任意の時点で任意の数の変数またはオブジェクトプロパティによって参照されることがあり、いつでも変更される可能性があります。 – Pointy

答えて

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");

は、オブジェクト2つの別々のインスタンスを、独自のインスタンスプロパティに格納されているさまざまなデータを持つ各が作成されます。

コンストラクタ関数として呼び出される関数は、パスケース(大文字で始まる)を使用して名前を付けて、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を使用することを覚えて、あなたの、開発者にかかっているので、キーワードには、object.create()メソッドが含まれています。このメソッドを使用すると、プロトタイプオブジェクトとして機能するオブジェクトを渡すことができ、使用する新しいインスタンスが返されます。

0

一般的には、Prototypesの詳細をご覧ください。

... 
    this.enemyMovement(); 
} 
関連する問題