2015-09-04 105 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' 

希望有所帮助。