2016-05-31 15 views
-2

Ich habe eine Aufgabe in erster Linie von Funktionen/Methoden zusammengesetzt, ähnlich wie diese (was funktionieren soll!):Triple-verschachtelte Objekt Funktionen js

function thing1(){ 
    this.thing2 = function(){ 
     this.thing3 = function(){ 
      alert(); 
     } 
    } 
} 

Aber

Als ich thing1.thing2.thing3() nennen, ich

Kann nicht Eigentum 'thing3' undefinierten

vollständigen Pseudo-Code lesen:

function thing1(){ 
    this.thing2 = function(){ 
     this.thing3 = function(){ 
      alert(); 
     } 
    } 
} 

var foo = new thing1(); 
foo.thing2.thing3(); 
+0

"* Welche funktionieren sollte *!" - auch nicht. Was Sie geschrieben haben, kann als 'var o = new thing1(); o.thing2(); o.thing3() ' – Bergi

Antwort

0

thing2 gibt nichts zurück, was zur Rückgabe undefined führt.

Wenn Sie verkettete Funktionen schreiben möchten, müssen Sie this zurückzukehren:

function thing1() { 
    this.thing2 = function() { 
     this.thing3 = function() { 
      alert(); 
     } 
     return this; // chained 
    } 
} 

Im Allgemeinen ist es besser, Methoden zu einem Prototyp Funktionen zuweisen, wenn Sie es als Konstruktor verwenden möchten. Sie können Funktionen auf dem Prototyp noch verketten.

function thing1() { 
 
} 
 

 
thing1.prototype.thing2 = function() { 
 
    return this; // chained 
 
}; 
 

 
thing1.prototype.thing3 = function() { 
 
    alert('thing3'); 
 
    return this; // you can make this one chained as well, if you like 
 
}; 
 

 
var t = new thing1(); 
 
t.thing2().thing3().thing2().thing3();

Wenn Sie wollen, ohne Klammern eine Basiskette nur erstellen, können Sie eine separate getter function erstellen.

function thing1() { 
 
} 
 

 
Object.defineProperty(thing1.prototype, 'thing2', { 
 
    get: function() { 
 
    return this; 
 
    } 
 
}); 
 

 
thing1.prototype.thing3 = function() { 
 
    alert('thing3'); 
 
    return this; 
 
}; 
 

 
var foo = new thing1(); 
 
foo.thing2.thing3().thing2.thing3();

+0

... und Sie sollten Methoden in keiner anderen Methode (als dem Konstruktor) erstellen. – Bergi

+0

@Bergi Richtig. Ich war dabei zu aktualisieren, als Sie das eingegeben haben;) –

+0

Ahhh okay, hab es. – AlgoRythm

0

Diese sind Konstrukteure:

function thing1(){ 
 
    this.thing2 = function(){ 
 
     this.thing3 = function(){ 
 
      alert(); 
 
     } 
 
    } 
 
} 
 

 
(new (new thing1()).thing2()).thing3()

Wenn Sie thing1.thing2.thing3() anrufen möchten, sollten Sie es wie folgt formatiert:

function thing1(){ 
 
    this.thing2 = { 
 
     thing3: function(){ 
 
      alert(); 
 
     } 
 
    } 
 
} 
 

 
var foo = new thing1(); 
 

 
foo.thing2.thing3()

+0

Sie müssen keine Konstruktoren sein. Nur weil Sie 'this 'eine neue Eigenschaft zuweisen, heißt das nicht unbedingt, dass es sich um einen Konstruktor handelt (obwohl das im Allgemeinen der Fall ist). –

+0

Ok, wie würde ich sie konstruieren mit dem Elternteil konstruiert wird? Also könnte ich einfach ding1.thing2.thing3() anrufen? Würde ich den Abschnitt function() {} loswerden und einfach alles in einer Variablen vortäuschen? – AlgoRythm