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

Ver*_*onW 28 javascript jquery constructor object

我有一个像这样的JavaScript构造函数:

function Box(obj) {
    this.obj = obj;
}
Run Code Online (Sandbox Code Playgroud)

我想传递一个对象作为这样的参数:

var box = new Box({prop1: "a", prop2: "b", prop3: "c"})
Run Code Online (Sandbox Code Playgroud)

并给我这样的东西:

box.obj.prop1
box.obj.prop2
box.obj.prop3
Run Code Online (Sandbox Code Playgroud)

但我希望这些属性直接在对象上,如下所示:

box.prop1
box.prop2
box.prop3
Run Code Online (Sandbox Code Playgroud)

我知道我可以这样做:

function Box(obj) {
    this.prop1 = obj.prop1;
    this.prop2 = obj.prop2;
    this.prop3 = obj.prop3;
}
Run Code Online (Sandbox Code Playgroud)

但这并不好,因为那时我的构造函数必须在对象参数的属性名称之前"知道".我想要的是能够将不同的对象作为参数传递,并将它们的属性直接指定为构造函数创建的新自定义对象的属性,所以我得到box.propX和不得box.obj.propX.希望我自己清楚,也许我正在测量一些非常明显的东西,但我是新手,所以请你需要帮助!

提前致谢.

Hem*_*ock 24

你可以做到这一点.可能还有一种jquery方式......

function Box(obj) {
  for (var fld in obj) {
    this[fld] = obj[fld];
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您(我认为是愚蠢的)扩展对象,您可以包含h​​asOwnProperty的测试

function Box(obj) {
   for (var fld in obj) {
     if (obj.hasOwnProperty(fld)) {
       this[fld] = obj[fld];
     }
   }
 }
Run Code Online (Sandbox Code Playgroud)

编辑

啊,哈!它的jQuery.extend

所以,jQuery方式是:

function Box(obj) {
  $.extend(this, obj);
}
Run Code Online (Sandbox Code Playgroud)

  • 有一点要注意,两种解决方案都不是做_deep copy_.根据您的_actual_实现,可能会出现问题.例如,如果不是匿名传递对象,而是创建变量`obj = {prop1:...,propDanger:{a:1,b:2}}`并将其传递给构造函数`var box = new Box(obj) )`,然后编辑为'obj.propDanger.a`也将改变`box.propDanger.a`. (5认同)

gle*_*ebm 8

简单地把它放在你的构造函数中

  for (var prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      this[prop] = obj[prop];
    }
  }
Run Code Online (Sandbox Code Playgroud)


Ger*_*les 7

真的很短

function Box(obj) {
  Object.assign(this, obj);
}
Run Code Online (Sandbox Code Playgroud)