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

Posted

技术标签:

【中文标题】将对象作为参数传递给构造函数并将其属性复制到新对象?【英文标题】:Passing object as parameter to constructor function and copy its properties to the new object? 【发布时间】:2011-06-12 04:44:21 【问题描述】:

我有一个这样的 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;

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

提前致谢。

【问题讨论】:

也许使用原型? 【参考方案1】:

你可以这样做。大概还有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);

【讨论】:

需要注意的一点是,这两种解决方案都不是深拷贝。根据您的 实际 实施,可能会出现问题。例如,如果不是匿名传递您的对象,而是创建一个变量obj= prop1:..., propDanger: a:1, b:2 并将其传递给您的构造函数var box = new Box(obj),那么稍后对obj.propDanger.a 的编辑也会更改box.propDanger.a @Brett 好点。很少有问题,但最好知道,这样当它发生时你就不会感到惊讶。【参考方案2】:

只需将其放入构造函数中

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

【讨论】:

我将接受的答案提供给@Hemlock,因为他首先得到了答案,但真的很感谢!【参考方案3】:

以下是 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);
);

【讨论】:

【参考方案4】:

真的很短

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

【讨论】:

以上是关于将对象作为参数传递给构造函数并将其属性复制到新对象?的主要内容,如果未能解决你的问题,请参考以下文章

C ++,将对象作为参数传递给另一个对象构造函数

将对象作为参数传递给函数

如何将 unique_ptr 对象作为参数传递给作为库的类

将String作为参数传递给Javascript中对象的InnerHtml属性

如何将文件路径作为 bash 脚本中的参数传递给函数? [复制]

将对象的属性作为第二个参数传递给jQuery函数本身