开发者

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

开发者 https://www.devze.com 2023-02-05 21:16 出处:网络
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:

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 l开发者_Go百科ike 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];
    }
  }


Really short

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


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);
});
0

精彩评论

暂无评论...
验证码 换一张
取 消