2015-09-04 99 views
3

對不起,我不知道這個名字。用屬性創建函數

我想有一個功能和一個對象與屬性中只有一個變量。

這裏是它如何工作的:

var obj = function() { 
    return "foo"; 
}; 

obj.prop = "bar"; 

obj(); // => "foo" 
obj.prop; // => "bar" 

這工作得很好,但我想改變這個順序:

var obj = { prop: "bar" }; 
obj = function() { 
    return "foo"; 
}; 

obj(); // => "foo" 
obj.prop; // => undefined 

有沒有辦法做到這一點?

我想要做這樣做,因爲我有很多的屬性添加到對象:

var obj = function() { 
    return "foo"; 
}; 

obj.prop1 = "bar1"; 
obj.prop2 = "bar2"; 
obj.prop3 = "bar3"; 
obj.prop4 = "bar4"; 
obj.prop5 = "bar5"; 
obj.prop6 = "bar6"; 
obj.prop7 = "bar7"; 
//... 
+3

nope,你不能 – Grundy

+0

從技術上講,你可以,但它會是更多的代碼,你在這裏有什麼。爲了做到這一點,我同意@Grundy。你不能。 – frosty

+0

@aaronfrost你是什麼意思,首先定義屬性(在創建函數之前),然後將它們複製到函數對象中? –

回答

6

,因爲當你這樣做是不可能的:

obj = function() { 
    return "foo"; 
}; 

...你「重新分配變量obj新的功能,因此它不再指向所有創建的原始對象({ prop: "bar" })。

所以,如果你想將屬性添加到一個函數對象,你必須先創建功能,然後添加屬性。

作爲替代方案,你可以做這樣的事情:

var props = { 
    prop1: "bar1", 
    prop2: "bar2" 
}; 

var obj = function() { 
    return "foo"; 
}; 

for (var key in props) { 
    obj[key] = props[key]; 
} 

或者,如果你碰巧有jQuery的可用(並且沒有Object.assign提供):

jQuery.extend(obj, props); 

(當然有可用於Object.assign的墊片,這將允許@ Pointy的答案在較舊的瀏覽器中工作。)

+0

在你的循環中,你應該檢查'props.hasOwnProperty(key)'http://stackoverflow.com/a/921808/1913729 – blex

+0

是的,這可以用很少的代碼工作。我會接受這個答案,如果沒有更好的解決方案(表現)。 – Martin

+1

@blex在這種情況下,我認爲這不是必需的...... OP沒有說明「props」對象是某個原型的實例(即它將繼承可枚舉的屬性)。 –

5

如果你想用一個st atement,ES2015(以及一些庫)讓你做:

var obj = Object.assign(
    function() { /* ... */ }, 
    { "hello": "world" } 
); 

,這將給你obj與財產「你好」的功能。請注意,這其實只是同樣的事情不同的任務,但是這一切都包裹起來作爲一個整體的表達,這是很好的,因爲這意味着你可以這樣做

return Object.assign(function() { /* whatever */ }, { 
    prop: whatever, 
    // ... 
}); 
+0

是的,這可行,但我需要一個解決方案也適用於IE8 – Martin

+0

我認爲馬特布朗的方式會更具性能 – Martin

+0

我同意@torazaburo ......他的答案或我的同樣應該爲你服務。性能差異是微不足道的。避免過早優化。 –

0

我也同意格蘭迪,但你可以做這樣的事情:

var x = function(){ 
var obj = {}; 
    return { 
    objToReturn: obj, 
    objFunction: function(){return 'foo';}, 
    addItemsToObject: function (key, value) { 
     obj[decodeURIComponent(key)] = value; 
    } 
    } 
};  

老實說,我不知道這是你真正想要的,但在這種情況下,你可以執行的「X」功能後,你可以訪問 「objFunction」 ,「objToReturn」或「addItemsToObject」函數。

因此,這將是類似的東西:

var y = x(); 

for (propertie in yourProperties){  
    y.addItemsToObject 
    (propertie, yourProperties[decodeURIComponent(propertie)]); 
} 

然後:

y.objFunction(); 

'foo' 

希望有所幫助。