2015-08-12 2 views
2

Я пытаюсь понять, как создать методы вызова после вызова метода.javascript - как «свободный API» (также называющий «цепочка»)?

Например, в JQuery у вас есть что-то вроде этого:

$("blah").data("data-id");

Как бы я сделать:

blah("cow").foo("moo");

где mothods бла и Foo только console.log(value)?

+2

Функция мля должен возвращать объект, который имеет функцию с именем Foo – andrrs

ответ

4

Что вы имеете в виду, это «свободный API» (также называющий «цепочка»). Ваши функции должны вернуть объект, который имеет следующий метод, который вы хотите вызвать. Например,

var obj = function(){ 
 
     var self = this; 
 
     self.blah = function(v){ console.log(v); return self; }; 
 
     self.foo = function(v){ console.log(v); return self; }; 
 
    }; 
 

 
    var o = new obj(); 
 
    o.blah("cow").foo("moo");

Смотрите эту статью для получения дополнительной информации: http://www.i-programmer.info/programming/javascript/4676-chaining-fluent-interfaces-in-javascript.html

+0

Почему переименовать это самостоятельно? –

+0

@NathanWilson, это всего лишь безопасный способ написания кода. 'this' относится к объекту, вызывающему метод, и поэтому может изменяться в зависимости от способа вызова метода. Например, если вы должны назначить метод событию клика без создания замыкания, 'this' будет ссылаться на объект, поднимающий событие. – adam0101

+0

@NathanWilson, Рассмотрим следующий пример: 'var x = new function() {this.prop = 1; this.get = function() {return this.prop; }; }(); var y = {prop: 2, getX: x.get}; console.log (y.getX()); 'Когда вы запустите это, он возвращает * 2 *, когда вы можете ожидать * 1 *. Сравните это с этим: 'var x = new function() {var self = this; self.prop = 1; self.get = function() {return self.prop; }; }(); var y = {prop: 2, getX: x.get}; console.log (y.getX()); ', который сохраняет ссылку на исходный объект и возвращает * 1 *, как и ожидалось. – adam0101

0

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

Вот пример из того, что я сделал некоторое время назад:

// I extend a class with a new function 
HtmlObject.prototype.stop = function() { 

    clearInterval(this.updater); 
    this.animationQue = []; 
    this.updater  = undefined; 

    // Then return the object that initially called the function 
    return this; 
}; 

Так что я мог бы использовать его как object.stop() nextfuntion();.

Кроме того, в JQuery $ является просто ярлыком для функции JavaScript.

Я сделал то же самое в своем тесте, но затем с _. Я должен признать, что это не так, как изящная JQuery, но:

var _ = function (selector, context) { 
    var el = new xyvLib(); 
    // This will simply return a collection of HtmlObjects (of which you can find a snipet above) 
    return el.fn.select(selector, context); 
}; 
0

Функция мля должен возвращать объект с методом Foo. Вот пример:

function blah(blahArg) { 
    return { 
     foo: function (fooArg) { 
      console.log(blahArg, fooArg); 
     } 
    }; 
} 

blah("cow").foo("moo"); 
0

Вы можете вызвать .foo на результат blah() только тогда, когда blah() возвращает объект, который принимает метод foo на него ,

Простой пример был бы так:

function foo(value) { 
    console.log(value); 
} 
function blah(value) { 
    console.log(value); 
    return { foo: foo } 
}