2011-01-20 51 views
23

我有一个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。希望我自己清楚,也许我正在测量一些非常明显的东西,但我是一个新手,所以请你需要你的帮助!

在此先感谢。

回答

20

你可以这样做。有可能是也是一个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); 
} 
+5

一件事注意两个解决方案都没有做一个_deep copy_。取决于你的_actual_实现有潜在的问题。例如,如果不是匿名传递你的对象,你可以创建一个变量`obj = {prop1:...,propDanger:{a:1,b:2}}`并将其传递给你的构造函数`var box = new Box(obj )`,之后编辑为`obj.propDanger.a`也会改变`box.propDanger.a`。 – 2011-01-20 05:12:14

+1

@Brett好点。很少有问题,但一个好的想法是知道的,所以当它发生时你不会感到惊讶。 – Hemlock 2011-01-20 13:19:41

7

简单地把这个在你的构造

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

下面是使用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); 
}); 
相关问题