2016-11-14 3 views
0

Ich habe ein neues Objekt erstellt, und in diesem Objekt habe ich mehrere Objektvariablen, aber das Ereignis (optional) Objekt wird nicht korrekt festgelegt. Es wird als undefiniert angezeigt, wenn es in der Build-Funktion auf der Registerkarte Event aufgerufen wird, und ich vermute, dass es etwas damit zu tun hat, dass es möglicherweise asynchron ist. Unten sind mein Objekt und mein Aufruf und auch was ich bekomme, wenn ich auf das Objekt referenziere.JavaScript Objektkonstruktor Einstellung als undefined

Ich kann nicht herausfinden, warum es genau so undefiniert kommt, wie es gesetzt wird, bevor die Build-Funktion überhaupt aufgerufen wird.

UPDATE: Diese Geige hat den genauen Code als aufgerufen. https://jsfiddle.net/trickell/Leg1gqkz/2/

Das Problem liegt in der Methode checkEvents().

var Wizard = function(id, events) { 
    this.activeTab = ''; 
    this.prevTab = ''; 
    this.nextTab = ''; 
    this.events  = (events) ? events : {}; // Optional events object. User may define events based on tab. (ex. "tabName" : function(){}) 

    console.log(this.events); // Returns object with no keys 

    this.build(id); 
    return this; 
} 

Wizard.prototype.build = function(id){ 
    var tab = id, 
     events = this.events; 

    // **** This is what's showing up as undefined!!! *****/ 
    console.log(events.cardInfo); 
} 

(function($, undefined){ 

    var wiz = new Wizard($('#package_wizard'), 
    { 
     cardInfo : function() { 
      alert('hello world'); 
     } 
    }); 

})(jQuery); 

Antwort

5

Das Problem ist, dass Sie für build ein Semikolon nach Ihrer Definition sind vermisst. Ohne ein Semikolon, tun Sie im Wesentlichen diese:

Wizard.prototype.build = function() { 
    // do stuff 
}(function($, undefined) { ... })(); 

Bedeutung, Sie versuchen, die Funktion sofort und geben sie als Argument eine Funktion aufzurufen. Hier ist Ihr Code mit Semikolons an den richtigen Stellen.

var Wizard = function(id, events) { 
 
    console.log(events); 
 
    this.activeTab = ''; 
 
    this.prevTab = ''; 
 
    this.nextTab = ''; 
 
    this.events = (events) ? events : {}; // Optional events object. User may define events based on tab. (ex. "tabName" : function(){}) 
 

 
    console.log(this.events); // Returns object with no keys 
 

 
    this.build(id); 
 
    return this; 
 
}; // <-- Here's a semicolon 
 

 
Wizard.prototype.build = function(id) { 
 
    var tab = id, 
 
    events = this.events; 
 

 
    // **** This is what's showing up as undefined!!! *****/ 
 
    console.log(events.cardInfo); 
 
}; // <-- and the original problem 
 

 
(function($, undefined) { 
 

 
    var wiz = new Wizard($('#package_wizard'), { 
 
    cardInfo: function() { 
 
     alert('hello world'); 
 
    } 
 
    }); 
 

 
})(jQuery);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

-

Wie für Ihre Update, das Problem ist, dass Sie einen Tippfehler haben. Sie schrieb

event.cardInfo() 

wenn Sie

events.cardInfo() 
+0

geschrieben haben, sollte ich nicht genau es so zu definieren. Ich verwende den $ .extend (Wizard.prototype, {build: function() {}}); Methode von jquery. – jamadri

+0

@jamadri Dann zeigen Sie Ihren genauen Code. Wie Sie sehen können, war das in diesem Fall das Problem. Wenn du etwas anderes tust und dies nicht löst, muss ich diesen Code sehen. –

+0

Ich werde dies mit einer Fiddle-URL mit dem gesamten Widget ändern, das ich erstellt habe. Vielleicht wird es etwas Licht auf genau das, was passiert, werfen xD – jamadri