如何在一个步骤中使用属性创建Function Object

时间:2011-09-30 15:23:40

标签: javascript function object

这是一个学术问题,以澄清我对JavaScript的理解。

一旦创建了函数对象,就可以为其赋予属性。但是,是否可以在一个步骤中创建具有属性的函数对象?

例如,

function someFunction(){
}

var someFunctionObject=someFunction;


someFunctionObject.attr1="attr 1";

alert(someFunctionObject.attr1); /* "attr 1"

此处在创建对象后,在第二步中添加属性。是否有可能一步到位?

5 个答案:

答案 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. 我们不使用逻辑NOT运算符。这样可以保存解释时执行的指令。逻辑NOT不强制,因此使用它没有任何好处。
  2. 函数对象通常只初始化一次,所以逻辑上初始化应该是最后一次,因为它很少被调用。

答案 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"
}

这导致一个objectsomeFunctionObject,此时命名不佳,因为它只是一个常规对象),并为其分配了两个属性:一个字符串和一个函数。