这是一个学术问题,以澄清我对JavaScript的理解。
一旦创建了函数对象,就可以为其赋予属性。但是,是否可以在一个步骤中创建具有属性的函数对象?
例如,
function someFunction(){
}
var someFunctionObject=someFunction;
someFunctionObject.attr1="attr 1";
alert(someFunctionObject.attr1); /* "attr 1"
此处在创建对象后,在第二步中添加属性。是否有可能一步到位?
答案 0 :(得分:2)
这样做的最佳方法是将命名函数分配给变量,如下所示:
var someFunctionObject = (function someFunction() {
if (!someFunction.attr1) {
someFunction.attr1 = "attr1";
return someFunction;
}
// extra processing
}());
alert(someFunctionObject.attr1);
这有一个额外的好处,如果有人删除了attr1属性,它将在以后重新初始化,如下所示:
delete someFunctionObject.attr1; // deleted
someFunctionObject(); // reinitialized
alert(someFunctionObject.attr1); // back to square one
编写上述结构的更好方法是:
var someFunctionObject = (function someFunction() {
if (someFunction.attr1) {
// extra processing
} else {
someFunction.attr1 = "attr1";
return someFunction;
}
}());
这既快又好,因为:
答案 1 :(得分:0)
function someFunction(attr1){
this.attr1 = attr1;
}
var someFunctionObject = new someFunction('attr 1');
console.log( someFunctionObject.attr1 );
答案 2 :(得分:0)
var someFunc = new function(attr1){
this.attr1 = attr1;
}("blah");
alert(someFunc.attr1);
这是一步,但不是一个非常有用的结构。
答案 3 :(得分:0)
简短的回答是否定的。请阅读下面的解释。
您的代码的最终结果如下:
var myFunctionObject = {
prop1: 'foo',
prop2: 'bar',
construct: "alert('function body')"
};
myFunctionObject(); // should alert
myFunctionObject.prop1; // 'foo'
函数定义/声明实际上做了非常相似的事情 - 它创建了一个对象,其[[Construct]]属性设置为函数的实体。但是,这只是一个实现细节,您不能单独访问或设置[[Construct]]属性,因此您不能一次性定义其他属性(它需要额外的语法,并且没有可用的)。
但是,您可以在函数内部设置属性,如果这是您需要的。例如,这对缓存很有用:
function getSomething() {
if (getSomething.prop) return getSomething.prop;
return getSomething.prop = fetchResource();
}
答案 4 :(得分:-1)
你的短语中只是一点点(但很重要)。您在示例代码中所做的是创建一个函数,然后将该函数指定为另一个对象(someFunctionObject
)上的属性。
你用字面意思做的是这样的:
var someFunctionObject = {
someFunction : function(){},
attr1 : "attr 1"
}
这导致一个object
(someFunctionObject
,此时命名不佳,因为它只是一个常规对象),并为其分配了两个属性:一个字符串和一个函数。