创建具有属性的函数
Creating a function with properties
抱歉,我不知道它的名字。
我想要一个函数和一个对象,其属性只有一个变量。
工作原理如下:
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";
//...
这是不可能的,因为当您这样做时:
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 的答案在旧浏览器中工作。)
如果你想用一条语句做到这一点,ES2015(和一些库)让你这样做:
var obj = Object.assign(
function() { /* ... */ },
{ "hello": "world" }
);
这会给你 obj
作为 属性 "hello" 的函数。请注意,这实际上与单独的赋值是一回事,但它都包含在一个整体表达式中,这很好,因为这意味着您可以执行类似
的操作
return Object.assign(function() { /* whatever */ }, {
prop: whatever,
// ...
});
我也同意 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'
希望对您有所帮助。
抱歉,我不知道它的名字。
我想要一个函数和一个对象,其属性只有一个变量。
工作原理如下:
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";
//...
这是不可能的,因为当您这样做时:
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 的答案在旧浏览器中工作。)
如果你想用一条语句做到这一点,ES2015(和一些库)让你这样做:
var obj = Object.assign(
function() { /* ... */ },
{ "hello": "world" }
);
这会给你 obj
作为 属性 "hello" 的函数。请注意,这实际上与单独的赋值是一回事,但它都包含在一个整体表达式中,这很好,因为这意味着您可以执行类似
return Object.assign(function() { /* whatever */ }, {
prop: whatever,
// ...
});
我也同意 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'
希望对您有所帮助。