2011-03-02 10 views
2

Je développe une petite bibliothèque qui grandit lentement pour ne pas être si petite. Pour cette raison, j'ai décidé de mettre toutes mes fonctions dans myNamespace pour éviter les conflits laids et diviser en fichiers séparés pour faciliter la gestion du code. Malheureusement, quand je l'ai fait, j'ai cassé certaines choses qui fonctionnaient auparavant - à savoir étendre la fonctionnalité d'un objet Array. Ce fut ma première approche qui ne fonctionne pas:Extension d'objets dans mon espace de noms

if(myNamespace === undefined) { 
    var myNamespace = {}; 
} 

myNamespace.myArray = { 
    height: 0, 
    width: 0 
}; 

myNamespace.myArray.prototype = []; 

Maintenant, quand je fais:

testArray = myNamespace.myArray; 

Je ne peux pas semblent être en mesure de le faire:

testArray.push("test"); 

Comment Je répare ça? Quelle est la meilleure approche pour encapsuler du code dans un espace de noms? Je suis à peu près sûr que c'est juste moi qui confond les objets définis/instanciés, mais je ne connais tout simplement pas la bonne façon de le faire.

+0

Pouvez-vous élaborer sur ce qui s'est exactement cassé? Le code que vous avez posté maintenant ne montre vraiment aucune fonctionnalité réelle. – casablanca

+0

Oui, je devrais probablement le rendre un peu plus clair. Je vais éditer la question. –

+0

[Fonctionne pour moi] (http://jsfiddle.net/alexdickson/KavXu/). – alex

Répondre

1

Il ne s'agit pas d'un problème d'espace de noms. Il s'agit de la définition et de l'instanciation de votre classe. Les classes sont définies comme des fonctions, et non comme littéraux d'objet:

// define your class 
ns.MyArray = function(w, h) { 
    this.width = w; 
    this.height = h; 
}; 

// set the class prototype 
ns.MyArray.prototype = []; 

// instantiate 
var a = new ns.MyArray(5,10); 
a.push("Test"); 
a.length; // 1 
a[0]; // "Test" 
a.width; // 5 

Ce que vous faites est tout simplement créer un objet littéral, puis l'assigner à la variable testArray, même que celle-ci:

var o = {}; 
var testArray = o; 
testArray == o; // true 

Je ne suis pas sûr si je m'attendais à ce comportement, mais il semble que l'attribution du prototype d'un objet littéral comme {width:0, height:0} ajoute un champ normal avec la clé "prototype" - le prototype réel est toujours .

+0

Merci. Je commence juste à jouer avec javascript et je me bats toujours avec sa syntaxe. –