2012-01-18 2 views
2

Такого рода вещи работает в JavaScriptМожно ли использовать функции с суб-методами?

function main() { 
    return 1; 
} 
main.sub = function() { 
    return 2; 
}; 

main();  // 1 
main.sub(); // 2 

и кажется полезным для делать вещи, как

function props() { 
    return { color: props.color(), size: props.size() }; 
} 
props.color = function() { 
    // calculate and return color 
}; 
props.size = function() { 
    // calculate and return size 
}; 

, так что вы бы простой способ тянуть в объекте всех устоев с помощью prop() но если вам нужен только тот, который вы можете вызвать для него напрямую. Этот тип настроек хорошо?

+1

Интересно. Раньше я этого не делал. Лично я думаю, что это довольно круто :-) –

+0

@SergioTulentsev Сначала я был немного удивлен, но это имеет смысл, потому что в JavaScript все является объектом (за исключением примитивных значений, таких как логические и цифры). Связано: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function и http://mirkokiefer.com/blog/2010/02/everything-is-object-in-javascript/ – ryanve

ответ

1

Вообще это, вероятно, не является хорошей практикой:

призвание: props.color(); будет делать то же самое, как вызов props().color.

Что бы лучше картина будет чем-то следующим образом:

var props = function() { 
var theColor = function() { 
    // calculate the color 
}; 

var theSize = function() { 
    // calculate the size 
}; 

return { 
    color: theColor(), 
    size: theSize() 
} 
} 

var someprops = new props(); 

Вы могли бы вместо того, чтобы, например theColor() в качестве объекта для цвета, вы можете оставить его как функцию: Так что возвращение будет

return { 
color: theColor, 
size: theSize 
} 

разница в том, что props.color == "function", тогда как в предыдущем примере props.color бы уже составил результат функции.

+0

Мне нравится это вообще, но для этого я считаю, что возможность доступа к 'props.color()' является преимуществом, потому что 'props(). Color' заставляет вас запускать все вычисления, если вам нужен только тот. – ryanve

+0

Да, однако в последнем примере, если тип возвращаемого значения является просто функцией, обработка не выполняется до тех пор, пока не будет вызвана функция: 'var someprops = new props(); var something = someprops.color(); ' Вы только вызываете функцию по мере необходимости, помните, что даже функции - это объекты, которые вы можете обойти. –

+0

Вот и все! =) Второй способ, без '()' в возврате. Это то же самое быстро, но требует меньше кода. См. Http://jsperf.com/function-object-vs-closure и http://jsperf.com/closure-methods-performance. Плюс, я * думаю * 'новый' необходим только при обращении к объекту с помощью' this 'в методах. Если вам просто нужен один из них, вы можете просто использовать 'реквизит(). Color()'. См. Http://jsperf.com/closure-methods-performance-with-new – ryanve

2

Даже если это абсолютно законно, я бы сказал, что это неправильное использование вспомогательных методов. Он смущает функцию с возвращаемым значением указанной функции.

Я бы сказал, что правильное использование подтемов внутри функций - это когда вы хотите добавить метаданные для этой функции. Предположим, вы хотите установить свойство для функции, такой как документация, или хотите ли вы, чтобы она была запутана. Затем вы можете установить свойство для функции вместо базового объекта.

Несмотря на то, что ваше использование может сохранить некоторые записи, это делает чтение кода намного сложнее ИМХО. Вы всегда должны стремиться к легкости читаемости, а не к записи.

+0

Хорошие баллы. Итак, я полагаю, у вас есть что-то вроде 'props.all()' для получения всех em. – ryanve

+0

Я думаю, что полный ответ на этот вопрос можно найти здесь: http://stackoverflow.com/questions/208016/how-to-list-the-properties-of-a-javascript-object – Luis

+1

или реализовать его как закрытие. var props = function() { var theColor = function() {}; var theSize = function() {}; return {color: theColor(), размер: theSize() }; Это лучший шаблон в целом, поскольку он способствует инкапсуляции –

1

Это выглядит полезным, но не очень очевидно, что происходит, когда вы его используете.

Выражение props.color() возвращает то же самое, что и аналогичное выражение props().color, но производительность отличается тем, что последняя также вычисляет другие свойства, которые затем отбрасываются. Легко неправильно использовать эту функцию, не замечая, поэтому вам следует подумать об использовании подхода, в котором использование более четко показывает, что на самом деле происходит в коде.

+0

Точно. Отчасти это повлияло на меня. Если вам нужны все (или в случае) оба реквизита для использования в функции, вы можете создать локальный 'var props = props();', а затем получить доступ к 'props.color' и т. Д. В локальной области. Если вам нужен только один из них, вы должны использовать 'props.color()' и не должны вычислять все из них. – ryanve

Смежные вопросы