2011-01-20 52 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); 
}); 
相關問題