¿Cómo se debe 'encadenar' una función para llamar a esta función así?

F('Test').custom_substring(0,1);
0
enzian 31 ago. 2014 a las 14:08

3 respuestas

La mejor respuesta

El siguiente ejemplo proporciona un custom_substring que se puede encadenar que no modifica el objeto original, sino que devuelve uno nuevo. Esto es similar a cómo funcionan jQuery y otras bibliotecas (y cómo funcionan las operaciones de cadena incorporadas) y ayuda a crear un código más seguro y más predecible.

function F(str) {
    return {
        toString: function () { return str; },

        // You didn't provide an example of what you want custom_substring
        // to do, so I'll have it append a "!" to the beginning of the resulting value
        // (since I can't think of anything else for it to do)
        custom_substring: function (from, to) {
            return F("!" + str.substring(from, to));
        }
    };
}

var s1 = F("Hello everyone");
var s2 = s1.custom_substring(0, 7);
var s3 = s2.custom_substring(0, 5)
           .custom_substring(0, 4);

console.log(s1);  // Hello everyone
console.log(s2);  // !Hello e
console.log(s3);  // !!!He
1
JLRishe 31 ago. 2014 a las 14:31

Si realmente desea crear una carga en cadena, siempre debe devolver this de los métodos donde sea posible.

Por ejemplo, tenemos alguna clase con algunos métodos:

function Foo() {
    this.foo = 'bar';
    return this;
}

Foo.prototype = Object.create({
    sayFoo: function() {
        console.log(this.foo);
        return this;
    },

    getFoo: function() {
        return this.foo; // Here you can't make chainload
    },

    saySmth: function() {
        console.log('Something');
        return this;
    }
});

Y podemos usar esto:

var test = new Foo().sayFoo().saySmth().getFoo(); // prints this.foo -> 'Something' -> returns this.foo
console.log(test); // prints out this.foo
-1
ghaiklor 31 ago. 2014 a las 12:41

Debe devolver un objeto que tenga un miembro de método llamado custom_substring. Un ejemplo:

var F = function(){
  return {
    custom_substring:function(){
      console.log('custom substring');
      return this;
    }
  }
}

F('Test')
  .custom_substring(0,1)
  .custom_substring(0,1)
  .custom_substring(0,1);

Para crear objetos, puede usar funciones de constructor y prototipo, este es un tema complejo y explica aquí.

No me metería con el String.prototype porque eso rompe la encapsulación.

2
Community 23 may. 2017 a las 11:49