2017-01-02 12 views
-1

Ich arbeitete an der Schaffung einer Reihe von Objekten innerhalb eines Objekts, und ich dachte, es wäre eine gute Idee, einen Konstruktor als eine Objekteigenschaft zu setzen, um alles ein wenig weiter einzukapseln.Konstruktorfunktionen in einem Objekt?

//surprisingly you can't do this it returns an error 
// Uncaught TypeError: this.Dogs is not a constructor 
let dogs={ 
     keagon: new this.Dog("keagon","shih sue"), 
     spike: new this.Dog("spike","lab"), 
     Dog: function(name,breed){ 
     this.name=name; 
     this.breed=breed;  
    } 
} 

//nor can you do this 

let dogs2={ 
     keagon: new dogs2.Dog("keagon","shih sue"), 
     spike: new dogs2.Dog("spike","lab"), 
     Dog: function(name,breed){ 
     this.name=name; 
     this.breed=breed;  
    } 
} 
// this again returns an error 
//Uncaught ReferenceError: dogs2 is not defined 
//this leads me to believe you cant access objects within themselves  
//without the this key word correct? If so, I find a that a bit surprising 
//because you can call functions within themselves. 

//I was able to encapsulate like I wanted, by storing the newly created 
//objects as properties of their constructor, for example 

function Dog(name,breed){ 
     this.name=name; 
     this.breed=breed; 
} 
Dog.dogs={ 
      keagon: new Dog("keagon","shih sue"), 
      spike: new Dog("spike","lab") 
     } 
    // Dog.dogs.keagon > outputs Dog {name: "keagon", breed: "shih sue"} 
    //keagon object is a object type of object and not of function so it also 
    //inherits all the Object methods 

So ist es eine Möglichkeit, Put-Konstrukteuren und Objekteigenschaften zu setzen, wenn nicht gibt es einen Grund, warum Sie nicht Konstrukteuren in Objekte setzen können, aber Sie können Objekte auf ihren Konstrukteuren speichern und dies eine schlechte Idee tut? Würde das Erstellen von Objekten und das Speichern dieser Objekte auf ihrem Konstruktor sie kapseln? Gibt es irgendwelche Probleme, die mir nicht bewusst sind?

+0

Dies im ersten Beispiel Referenz das Objekt window, weil das Objekt gemacht wird, denke ich. Die zweite verweist auf ein Objekt, das noch nicht erstellt wurde, also wird es nicht funktionieren –

Antwort

0

Ich denke, Sie können eine Variable nicht deklarieren und verwenden Sie es in seiner Konstruktion. Sie können tun, wie diese

let dogs2={ 
     Dog: function(name,breed){ 
     this.name=name; 
     this.breed=breed;  
    } 
} 

Und

dogs2.keagon= new dogs2.Dog("keagon","shih sue"); 
dogs2.spike= new dogs2.Dog("spike","lab"); 

So kann man das Ergebnis bekommen Sie wollten.

Verwandte Themen