2014-11-11 4 views
4

Допустим, у нас есть два конструктора, как эти:доступа свойство объекта от вложенного объекта

function Player(x, y) { 
    this.x = x; 
    this.y = y; 
    this.hello = function() { 
    console.log("Hello, " + this.npc); // World npc property 
    } 
} 

function World() { 
    this.player = new Player(0, 0); 
    this.npc = "villager"; 
} 

Как я могу получить доступ ВСНП свойство мира от функции приветствия в проигрывателе?

этот не работает, поскольку World не является прототипом Player.

+0

Похоже, вы хотите сказать 'hello' кто это приветствие. Передайте его в качестве параметра. – Mathletics

ответ

2

Использование call. При использовании он позволит вам привязать контекст this от World к вызываемой функции hello в Player.

function Player(x, y) { 
 
    this.x = x; 
 
    this.y = y; 
 
    this.hello = function() { 
 
    alert("Hello, " + this.npc); // World npc property 
 
    } 
 
} 
 

 
function World() { 
 
    this.player = new Player(0, 0); 
 
    this.npc = "villager"; 
 
    this.player.hello.call(this); 
 
} 
 

 
new World();

+0

Мне это нравится, но что, если я хочу вызвать функцию во второй раз? Я не могу заставить его работать отдельно от момента, когда я инициализирую World. – pietrovismara

+1

@Cuz - Вы бы использовали 'world.player.hello.call (world)'. Или вы можете интернализировать вызов функции hello в мир, поскольку он не имеет большого отношения к игроку. Вы могли бы приветствовать, чтобы принять объект мира. Вы могли бы заставить World наследовать прототип игрока и реализовать свою собственную функцию hello. Существует много вариантов, которые требуют наименьшего количества изменений, используя 'call'. –

1

Pass его в качестве параметра:

function Player(x, y) { 
    this.x = x; 
    this.y = y; 
    this.hello = function(npc) { 
    console.log("Hello, " + npc); // World npc property 
    } 
} 

function World() { 
    this.npc = "villager"; 
    this.player = new Player(0, 0); 
    this.player.hello(this.npc); 
} 
+0

Зачем вы передаете его конструктору 'Player'? – Mathletics

+0

Это предполагает много о его желаемой архитектуре, но является хорошим решением. –

0
var World = function() { 
    this.npc = "villager"; 
    this.player = new Player(0, 0); 
    return { 
    npc: this.npc, 
    player: this.player 
    }; 
}(); 

Теперь вы можете получить доступ к npc из других контекстов, используя World.npc.

2

Вы должны создать экземпляр функции World, чтобы сделать его объект как так:

var world = new World(); 
alert(world.npc); 
+0

Да, так я и сделал, но я хотел бы знать, есть ли лучший способ. – pietrovismara

+0

Я не вижу этого в примере, который вы указали. Я думаю, вы отлично справились с разделом объектов на разные классы. Я бы не поступил иначе. Этот способ повысит удобство использования вашего кода. –

Смежные вопросы