Как создать объект функции с атрибутами за один шаг - PullRequest
0 голосов
/ 30 сентября 2011

Это академический вопрос, чтобы прояснить мое понимание JavaScript.

Функциональному объекту можно назначать атрибуты после его создания.Однако возможно ли создать объект функции с атрибутами за один шаг?

Например,

function someFunction(){
}

var someFunctionObject=someFunction;


someFunctionObject.attr1="attr 1";

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

Здесь атрибут добавляется на втором шаге после того, как объект былсоздано.Можно ли достичь этого за один шаг?

Ответы [ 5 ]

2 голосов
/ 30 сентября 2011

Лучший способ сделать это - назначить именованную функцию переменной следующим образом:

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 не приводит к принуждению, поэтому его использование не имеет никаких преимуществ.
  2. Объект функции обычно инициализируется только один раз, поэтому логически инициализация должна быть последней, так как она будет редко вызываться.
0 голосов
/ 30 сентября 2011

Короткий ответ - нет.Прочитайте объяснение ниже.

Конечный результат вашего кода выглядит примерно так:

var myFunctionObject = {
    prop1: 'foo',
    prop2: 'bar',
    construct: "alert('function body')"
};
myFunctionObject(); // should alert
myFunctionObject.prop1; // 'foo'

Определение / объявление функции фактически делает нечто очень похожее - он создает объект с [[Construct]] свойство, установленное на собственно тело функции.Но это всего лишь детали реализации, и вы не можете получить доступ или установить это свойство [[Construct]] отдельно, поэтому вы не можете определять другие свойства за один раз (для этого потребуется дополнительный синтаксис, а доступного нет).1007 * Но вы можете установить свойства внутри функции, если это то, что вам нужно.Например, это было бы полезно для кэширования:

function getSomething() {
    if (getSomething.prop) return getSomething.prop;
    return getSomething.prop = fetchResource();
}
0 голосов
/ 30 сентября 2011

Вы только крошечный (но важный) кусочек в вашей фразе. В вашем примере кода вы создали функцию, а затем присвоили эту функцию как свойство другого объекта (someFunctionObject).

То, что вы сделали в буквальном смысле, выглядит так:

var someFunctionObject = {
    someFunction : function(){},
    attr1 : "attr 1"
}

Это приводит к одному object (someFunctionObject, который на данный момент плохо назван, поскольку это просто обычный объект) с двумя назначенными ему свойствами: одной строкой и одной функцией.

0 голосов
/ 30 сентября 2011
var someFunc = new function(attr1){
  this.attr1 = attr1; 
}("blah");

alert(someFunc.attr1);

Это один шаг, но не очень полезная конструкция.

0 голосов
/ 30 сентября 2011
function someFunction(attr1){
  this.attr1 = attr1; 
}

var someFunctionObject = new someFunction('attr 1');
console.log( someFunctionObject.attr1 ); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...