Search code examples
javascriptmarionettebackbone-views

Checking if parameter is a contructor or an instance in javascript


I wanna do the following, if the parameter passed is a contructor, then do new 'constructor' if not, just use the instance. How can I do that?

This is what I've done so far, but it doesn't work. I think something is wrong with my code:

JS

var showList = function (view, options) {

  // checking if view is a conctructor or not
  if (view instanceof view) {
    app.getRegion('main').show(view(options));
  } else {
    app.getRegion('main').show(new view(options));
  }                
}

so the above function can be used as:

var listView = new ListView;
showList(listView);

or straight:

showList(new ListView);

Solution

  • I think you're going to want to test whether the argument is an object or a function:

    if (typeof view === "function")
    

    will tell you it's a function (a constructor function in your context)

    if (typeof view === "object")
    

    will tell you that it's an already constructed object.


    var showScreen = function (view, options) {
    
      // check if view is already an object
      if (typeof view === "object") {
        app.getRegion('main').show(view(options));
      } else {
        app.getRegion('main').show(new view(options));
      }                
    }
    

    One thing I'm confused about in your code is if view is already an object, then why do you do view(options). That doesn't make sense to me. Doing new view(options) when view is a function makes sense, but not the other option so I think something also needs to be corrected with that line of code. Do you perhaps mean to call a method on that object?


    FYI, I tend to avoid using instanceof as a general practice if there is another option because instanceof can have issues with cross frame code whereas typeof does not have those issues.