创建具有属性的函数

时间:2015-09-04 18:13:52

标签: javascript function object javascript-objects

抱歉,我不知道这个名字。

我想要一个函数和一个只有一个变量属性的对象。

以下是它的工作原理:

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 个答案:

答案 0 :(得分: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的答案在旧浏览器中运行。)

答案 1 :(得分:5)

如果您想使用一个语句执行此操作,可以使用ES2015(以及一些库):

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

这将为您提供obj作为属性" hello"的函数。请注意,这与单独的赋值实际上是一样的,但它全部包含在一个整体表达式中,这很好,因为它意味着您可以执行类似

的操作
return Object.assign(function() { /* whatever */ }, {
  prop: whatever,
  // ...
});

答案 2 :(得分:0)

我也同意Grundy,但你可以这样做:

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'

希望有所帮助。