2013-04-22 4 views
0

Вот пример кода, который я пытаюсь выполнить.Область применения вложенных прототипов Javascript

var Game = function(){ 
    this.state = 'yeah'; 
} 

Game.prototype.call = function(){ 
    document.writeln(this.state); 
    Game.prototype.say(); 
} 

Game.prototype.say = function(){ 
    document.writeln(this.state); 
} 

game = new Game(); 
game.call(); 

В результате yeah undefined, что означает, что call() работает должным образом в то время как say() нет. Что я могу сделать для функции say(), чтобы иметь возможность получить this.state из Game?

+1

Я бы не рекомендовал определять метод '.call()'. Хотя технически это может работать в некоторых случаях, это может действительно смутить людей с помощью функции Function.call(), которая есть у каждой функции. – jfriend00

+0

Вы не должны использовать ['writeln'] (http://www.w3.org/TR/2000/WD-DOM-Level-2-HTML-20001113/html.html#ID-35318390), как если бы документ закрыт (например, после отправки события загрузки) он сначала вызовет ['document.open'] (http://www.w3.org/TR/DOM-Level-2-HTML/html.html# ID-72161170), который очистит документ существующего контента. – RobG

ответ

2
Game.prototype.call = function(){ 
    document.writeln(this.state); 
    this.say(); 
} 

прототип используется для определения функции - не называя его

+0

ahh спасибо! скоро проверит вас –

0

никогда, пожалуйста, никогда не переопределять нативные методы (например, call в данном случае) ..

также то, как это работает слишком

Game.prototype.call = function(){ 
    document.writeln(this.state); 
    Game.prototype.say.apply(this); 
} 
+3

'call' не является нативной функцией для объектов, он существует в' Function.prototype', но не скрывается в этом случае. Я согласен с тем, что вам следует избегать функций именования 'call', но это не * * * большой сделки. – zzzzBov

0

похоже, что вы хотите:

Game.prototype.call = function(){ 
    document.writeln(this.state); 
    this.say(); 
} 

Однако эта версия будет вызывать любые функции устанавливаются в this.say, который может быть отменен, если объект наследуется:

var MyGame = function() {}; 
MyGame.prototype = new Game(); 
MyGame.prototype.say = function() { 
    document.writeln('something else'); 
}; 
var m = new MyGame(); 
m.call(); //'something else' 

Если вы хотите использовать оригинальную ссылку на Game.prototype.say (без наследования), то будете должны вызвать функцию в контексте объекта:

Game.prototype.call = function(){ 
    document.writeln(this.state); 
    Game.prototype.say.call(this); 
} 
var m = new MyGame(); 
m.call(); //'yeah' 
0

TGH дал вам решение, но не объяснил. Ваша задача здесь:

> Game.prototype.say(); 

Вы вызываете say как метод Game.prototype, поэтому в функции:

> Game.prototype.say = function(){ 
> document.writeln(this.state); 
> } 

this является ссылкой на объект-прототип, а не экземпляр. Вы хотите, чтобы вызвать функцию, как:

this.say(); 

так, что это называется как метод экземпляра, установив тем самым this в say к экземпляру.

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