Цепочка метода объекта JavaScript: полезно?
Итак... возиться в JavaScript с идеей, которая для меня новая, с методами Object возвращает объект Object, частью которого они являются; это приводит к сцепляемости. Тогда мой вопрос: как это может быть полезно? Я бросил это вместе, чтобы проверить основные работы:
<script>
MathChain = function()
{
this.pass = function()
{
this.multiply = eval(arguments.join('*'));
this.add = eval(arguments.join('+'));
return this;
}
}
m = new MathChain().pass(5, 10, 20).multiply; // 1000
a = new MathChain().pass(5, 10, 20).add; // 35
</script>
Это явно не злобно эффективный экземпляр, в котором можно было бы использовать эту концепцию, так что вы могли бы указать мне на то, что делает это правильно (кроме jQuery, пожалуйста)?
Ответы
Ответ 1
Ну, вот пример не очень реального мира, но я думаю, вы поймете эту идею. Если позволяет выполнять несколько различных операций над объектом и обеспечивает удобство.
var truck = function() {
this.turnLeft = function {
// turn left
return this;
}
this.turnRight = function {
// turn right
return this;
}
this.goReallyFast = function {
// go fast!
return this;
}
};
// My get-away plan
var myTruck = new truck();
myTruck.turnLeft().turnRight().goReallyFast();
Ответ 2
Для совершенно другого (не-OO) примера цепочка несколько похожа на Unix-конвейеры. Каждый шаг Unix-канала возвращает полный (измененный) контент, подходящий для отправки на следующий шаг:
cat file1 file2 | sort -n | awk '{print $2}' | sed 's/@/ at /g'
Ответ 3
Свободный интерфейс - http://en.wikipedia.org/wiki/Fluent_interface
Да, я думаю, что это может быть очень полезно, но, как любой шаблон дизайна, следует использовать только при необходимости
Изменить: здесь клиент twi api в С# с использованием свободного интерфейса - http://code.google.com/p/tweetsharp/
Ответ 4
Один пример, где это полезно, с небольшим изменением вашей проблемы — вместо того, чтобы возвращать один и тот же объект, вы создаете объект неизменным. Затем ваши функции возвратят новый экземпляр того же типа, но с уже установленными свойствами.
У этого есть много практических приложений, особенно в области функционального программирования.
Ответ 5
Пока он работает не так, как ваш пример (TBH, я никогда не видел, чтобы это делалось ранее), jquery считает, что "цепочка" чтобы быть очень полезным, а jquery в значительной степени является мерилом в наши дни, когда дело доходит до веб-фреймворков JS... так что да: -)
Ответ 6
Я нашел этот вопрос, ища общее решение о том, как сделать методы целыми, после того как они определены. Вот что я придумал. Я неофит JavaScript; покупатель остерегается.
makeChainable = function() {
var receiver = arguments[0]
for (var i = 1; i < arguments.length; i++) {
functionName = arguments[i];
(function() {
wrapped = receiver[functionName];
receiver[functionName] = function() {
wrapped.apply(receiver, arguments);
return receiver;
}
})();
}
}
daisy = {
name: 'Daisy',
moo: function() { console.log(this.name + " moos!") }
}
makeChainable(daisy, 'moo');
daisy.moo().moo().moo();
Ответ 7
В JavaScript все это время появляется при навигации по DOM. В частности, когда вы пытаетесь пробираться сквозь кучу элементов, которые не имеют идентификаторов.
Например, возник вопрос о SO относительно нахождения первого элемента таблицы. Он может включать в себя множество циклов или цепочки команд.
Ответ 8
Цепочка JavaScript может быть очень полезна, если вы хотите выполнить последовательность действий над одним объектом. Я согласен с Майклом Лутоном ниже, с цепью следует обращаться осторожно. Если вы добавите один или два прикованных метода к объекту, который все еще доступен для чтения. Если вы начинаете добавлять четыре, пять или даже девять, тогда ваш код становится сложнее не только читать, но и поддерживать.
Ответ 9
Все дети любят цепочки. Однако, по моему опыту, его следует использовать с осторожностью, поскольку он может уменьшить читаемость кода. Другими словами, сделайте то, что имеет для вас смысл, и его легко понять другим программистам, которые знакомы с концепцией.