简体   繁体   中英

Passing object as parameter to constructor function and copy its properties to the new object?

I have a JavaScript constructor like this:

function Box(obj) {
    this.obj = obj;
}

which i want to pass an object as a parameter like this:

var box = new Box({prop1: "a", prop2: "b", prop3: "c"})

and gives me something like this:

box.obj.prop1
box.obj.prop2
box.obj.prop3

but I would like the properties to be directly on the object like this:

box.prop1
box.prop2
box.prop3

I know I could do something like this:

function Box(obj) {
    this.prop1 = obj.prop1;
    this.prop2 = obj.prop2;
    this.prop3 = obj.prop3;
}

But that is not good because then my constructor would have to "know" before the names of the properties of the object parameter. What I would like is to be able to pass different objects as parameters and assign their properties directly as properties of the new custom object created by the constructor so I get box.propX and not box.obj.propX . Hope I am making myself clear, maybe I am measing something very obvious but I am a newbie so please need your help!

Thanks in advance.

You could do this. There is probably also a jquery way...

function Box(obj) {
  for (var fld in obj) {
    this[fld] = obj[fld];
  }
}

You can include a test for hasOwnProperty if you've (I think foolishly) extended object

function Box(obj) {
   for (var fld in obj) {
     if (obj.hasOwnProperty(fld)) {
       this[fld] = obj[fld];
     }
   }
 }

Edit

Ah, ha! it's jQuery.extend

So, the jQuery way is:

function Box(obj) {
  $.extend(this, obj);
}

Simply put this in your constructor

  for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      this[prop] = obj[prop];
    }
  }

Here's an example with the javascript module pattern:

var s,
NewsWidget = {

  settings: {
    numArticles: 5,
    articleList: $("#article-list"),
    moreButton: $("#more-button")
  },

  init: function(options) {
    this.settings = $.extend(this.settings, options);
    s = this.settings;
    this.bindUIActions();
  },

  bindUIActions: function() {
    s.moreButton.on("click", function() {
      NewsWidget.getMoreArticles(s.numArticles);
    });
  },

  getMoreArticles: function(numToGet) {
    // $.ajax or something
    // using numToGet as param
  }

};

$(function(){
  NewsWidget.init({
    numArticles: 6
  });

  console.log(s.numArticles);
});

Really short

function Box(obj) {
  Object.assign(this, obj);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM