Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将对象作为参数传递给构造函数并将其属性复制到新对象?_Javascript_Jquery_Object_Constructor - Fatal编程技术网

Javascript 将对象作为参数传递给构造函数并将其属性复制到新对象?

Javascript 将对象作为参数传递给构造函数并将其属性复制到新对象?,javascript,jquery,object,constructor,Javascript,Jquery,Object,Constructor,我有一个JavaScript构造函数,如下所示: function Box(obj) { this.obj = obj; } var box = new Box({prop1: "a", prop2: "b", prop3: "c"}) box.obj.prop1 box.obj.prop2 box.obj.prop3 box.prop1 box.prop2 box.prop3 function Box(obj) { this.prop1 = obj.prop1;

我有一个JavaScript构造函数,如下所示:

function Box(obj) {
    this.obj = obj;
}
var box = new Box({prop1: "a", prop2: "b", prop3: "c"})
box.obj.prop1
box.obj.prop2
box.obj.prop3
box.prop1
box.prop2
box.prop3
function Box(obj) {
    this.prop1 = obj.prop1;
    this.prop2 = obj.prop2;
    this.prop3 = obj.prop3;
}
我希望将对象作为参数传递,如下所示:

function Box(obj) {
    this.obj = obj;
}
var box = new Box({prop1: "a", prop2: "b", prop3: "c"})
box.obj.prop1
box.obj.prop2
box.obj.prop3
box.prop1
box.prop2
box.prop3
function Box(obj) {
    this.prop1 = obj.prop1;
    this.prop2 = obj.prop2;
    this.prop3 = obj.prop3;
}
给了我这样的信息:

function Box(obj) {
    this.obj = obj;
}
var box = new Box({prop1: "a", prop2: "b", prop3: "c"})
box.obj.prop1
box.obj.prop2
box.obj.prop3
box.prop1
box.prop2
box.prop3
function Box(obj) {
    this.prop1 = obj.prop1;
    this.prop2 = obj.prop2;
    this.prop3 = obj.prop3;
}
但我希望属性直接位于对象上,如下所示:

function Box(obj) {
    this.obj = obj;
}
var box = new Box({prop1: "a", prop2: "b", prop3: "c"})
box.obj.prop1
box.obj.prop2
box.obj.prop3
box.prop1
box.prop2
box.prop3
function Box(obj) {
    this.prop1 = obj.prop1;
    this.prop2 = obj.prop2;
    this.prop3 = obj.prop3;
}
我知道我可以这样做:

function Box(obj) {
    this.obj = obj;
}
var box = new Box({prop1: "a", prop2: "b", prop3: "c"})
box.obj.prop1
box.obj.prop2
box.obj.prop3
box.prop1
box.prop2
box.prop3
function Box(obj) {
    this.prop1 = obj.prop1;
    this.prop2 = obj.prop2;
    this.prop3 = obj.prop3;
}
但这并不好,因为这样我的构造函数就必须在对象参数的属性名称之前“知道”。我希望能够将不同的对象作为参数传递,并将它们的属性直接指定为构造函数创建的新自定义对象的属性,这样我就可以得到
box.propX
,而不是
box.obj.propX
。希望我能说清楚,也许我的意思很明显,但我是一个新手,所以请需要你的帮助


提前谢谢。

你可以这样做。可能还有一种jquery方式

function Box(obj) {
  for (var fld in obj) {
    this[fld] = obj[fld];
  }
}
如果您(我认为这是愚蠢的)扩展了对象,那么您可以包括对hasOwnProperty的测试

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

啊哈!!它是
jQuery.extend

因此,jQuery的方式是:

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

只需将其放入构造函数中

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

下面是一个javascript模块模式的示例:

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);
});
很短

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

我给了@Hemlock一个公认的答案,因为他是第一个得到的,但真的很感谢!需要注意的一点是,这两种解决方案都没有进行深度复制。根据您的实际实现,可能会出现问题。例如,如果不匿名传递对象,而是创建变量
obj={prop1:…,propDanger:{a:1,b:2}}
并将其传递给构造函数
var-box=new-box(obj)
,随后对
obj.propDanger.a
的编辑也将更改
box.propDanger.a
@Brett Good point。很少有问题,但要想知道就好了,这样当问题发生时你不会感到惊讶。也许使用原型?