2010-07-19 16 views
0

Je mets mon code d'une manière simple, mais si une bonne âme veut aider le code est |on Github| /lib/inmotion/editor.js(line 99)Pourquoi ce JavaScript OO est-il faux?

editor.js

function Editor(){ 
    var instance = this; 
    this.key_frames = [] // a list of key frames 
    this.kf = null // the current KeyFrame 

    function notice_click(click){ 
    instance.kf.add_bone(1) // <-- error here 
    // instance.kf.list.push(1) // <-- this works, but is incomplete 
    } 
} 

key_frame.js

function KeyFrame(){ 
    instance = this 
    instance.changed = false // for the redraw :) 
    instance.list = [] 

    function add_bone(bone){ 
    instance.list.push(bone) 
    instance.changed = true 
    return true 
    } 
} 

Mon programme a une instance de l'éditeur unique qui a beaucoup de cas de KeyFrames.
Chaque KeyFrame contient beaucoup d'os.
Donc il y a toujours un KeyFrame actif, défini par l'instance de Editor.kf
Comme je n'ai qu'un seul kf, je peux ajouter des os à celui-là sans problème, mais comme j'ajoute plus de KeyFrames je ne peux ajouter que add_bone au dernier kf j'ai créé! Pourquoi?

Si je n'étais pas assez clair, je présente mes excuses, demander le doute

+2

Tout d'abord, ** utiliser des points-virgules **, oui ils sont parfois optionnels ... quand vous y arrivez, il n'y a pas d'excuse légitime pour * ne * pas les utiliser, les utiliser, être explicite. Deuxièmement, 'instance = this' définit une variable * globale * nommée' instance', vous avez besoin de 'var instance = this;' pour qu'elle soit locale. –

+0

@Nick Craver: Oui, précisément, ne veux-tu pas en faire une réponse pour que je puisse choisir comme accepté? –

Répondre

1

Votre objet KeyFrame manque un var, il devrait ressembler à ceci:

function KeyFrame(){ 
    var instance = this; 
    instance.changed = false; 
    instance.list = []; 

    function add_bone(bone){ 
    instance.list.push(bone); 
    instance.changed = true; 
    return true; 
    } 
} 

Sans le mot-clé var vous définissez ou window.instance écraser, une variable globale , pas un local à l'objet comme vous voulez :)

+0

Ouais .. c'était idiot de ma part, ty! –

2

Le problème, pour autant que je le comprends, est que « instance » est écrasée chaque fois que vous appelez KeyFrame. Vous devriez utiliser 'ceci' directement.

+0

J'avais l'habitude de penser la même chose à propos de la 'ceci', mais comme ce gars a donné une bonne explication ici: http://stackoverflow.com/questions/3045953 –