Как сделать метод цепочки, но возвращая более 3 значений одновременно

Вы наверняка видели jquery. Знаете ли вы, что jquery позволяет вам создавать цепочки методов следующим образом:

$('.elements').css({color:'red'}).etc().etc()...

Но если вы заметили, эта функция возвращает вам массив объектов (?):

$(document).ready(function(){
  var $elements = $('.c').css({color:'red'});
  console.log($elements);
});

(Пример, см. консоль, чтобы увидеть результат)

Также работает функция $:

$(document).ready(function(){
  var $elements = $('.c');
  console.log($elements);
});

(Пример, см. консоль, чтобы увидеть результат)

Оба возвращают массив, а затем могут продолжать цепочку. Как это возможно? Почему можно продолжать цепочку, если она не возвращает только this (или сам объект)?

Я прочитал это сообщение, и он смог успешно добавить знак плюс, но это было к существующей строке, потому что он является прототипом строкового объекта.

Есть ли способ, которым я мог бы заархивировать это?

ОБНОВЛЕНИЕ

Я знаю, что он возвращает объект jquery, но как я могу вернуть свой объект, содержащий массив значений, и продолжать цепочку с возвращаемыми значениями.

ОБНОВЛЕНИЕ 2

Что я хочу заархивировать

У меня есть этот класс, и я хочу, чтобы метод возвращал массив моего объекта всякий раз, когда цепочка закончилась

var elements = Enumerable(anArray).Where(function(elements){ return elements != 1 })

Здесь цепочка закончилась, поэтому она должна возвращать элементы, удовлетворяющие условию, но я хочу сохранить цепочку, мне просто нужно сделать это:

elements  = elements.Where(function(elements){ return elements == 1}).Take(3);

И продолжай цепляться так долго, как я хочу.


person NewBiw    schedule 20.08.2013    source источник
comment
Я не совсем уверен, какова ваша цель или что именно вы спрашиваете. Кроме того, они на самом деле не возвращают массив, они возвращают объект jquery, внутри которого есть своего рода массив.   -  person Dallas    schedule 20.08.2013
comment
Это то, что я ищу, как вернуть массив моего объекта и с какими бы то ни было значениями и продолжать цепочку. Я просто знаю, как это сделать, вернув это, но не массив   -  person NewBiw    schedule 20.08.2013
comment
Почему? Вы можете легко отфильтровывать элементы из объекта jquery или даже вытягивать определенный элемент... и перебирать каждое полученное значение. Я думаю, вам нужно показать свою конечную цель, чтобы мы могли помочь вам в дальнейшем.   -  person Dallas    schedule 20.08.2013
comment
@smerny, посмотри мое обновление 2, пожалуйста   -  person NewBiw    schedule 20.08.2013
comment
Может быть, я все еще не понимаю, что вы пытаетесь сделать, но кажется, что это можно сделать с помощью комбинации filter() и slice()? jsfiddle.net/5Nv4X/2   -  person Dallas    schedule 20.08.2013
comment
Вы сделали это с Jquery, я хочу сделать это со своим классом, который я создаю, а не с jquery.   -  person NewBiw    schedule 20.08.2013


Ответы (2)


$ возвращает не массив, а объект jQuery, который представляет собой подобный массиву объект. т.е. некоторые из его свойств имеют числовые имена, и у него есть свойство length.

Пример:

var obj = {
    0: element1,
    1: element2,
    find: function() {
        // some logic
        return this; // return a reference to itself for chaining
    },
    length: 2
};

Теперь метод jQuery не возвращает this, он возвращает новый объект jQuery, который предоставляет тот же интерфейс (очевидно) и, следовательно, допускает цепочку.

Если вы хотите реализовать цепочку самостоятельно, вы должны сделать то же самое: либо вернуть this, либо новый экземпляр вашего объекта и инициализировать его данными, которые есть у текущего объекта.

Пример:

function Constr(data) {
    this.data = data || {};
}

Contr.prototype.chain = function() {
    // do stuff
    console.log(this.data);
    return new Constr(this.data);
    // or return this;
};

var obj = new Constr({foo: 'bar'});
obj.chain().chain().chain();
person Felix Kling    schedule 20.08.2013
comment
Да, пример, который я привел в качестве примера, также подходит для этого варианта использования. Опять же: либо верните this, либо новый экземпляр вашего класса. - person Felix Kling; 20.08.2013

объект jquery на самом деле представляет собой набор объектов html, поэтому, когда функция возвращает объект jquery, она фактически возвращает более одного элемента.

var ChainableObject = {
    data: [],
    where: function(fn){
       //doStuff with this.data
       return this;
    },
    take: function(n){
       //doStuff with this.data
       return this;
    },
    // and so on
    //.........
}
person amdorra    schedule 20.08.2013
comment
О, мужики, вы меня спасли!!!! Вот какой ответ!! Я бы принял ваш ответ, но у меня недостаточно репутации :( - person NewBiw; 20.08.2013