This commit is contained in:
Ilya Kantor 2016-11-12 19:38:58 +03:00
parent 5372c18379
commit 3defacc09d
314 changed files with 1761 additions and 1704 deletions

View file

@ -0,0 +1,15 @@
let ladder = {
step: 0,
up: function() {
this.step++;
return this;
},
down: function() {
this.step--;
return this;
},
showStep: function() {
alert(this.step);
}
};

View file

@ -0,0 +1,40 @@
describe('Ladder', function() {
before(function() {
window.alert = sinon.stub(window, "alert");
});
beforeEach(function() {
ladder.step = 0;
});
it('up() should return this', function() {
assert.equal(ladder.up(), ladder);
});
it('down() should return this', function() {
assert.equal(ladder.down(), ladder);
});
it('showStep() should call alert', function() {
ladder.showStep();
assert(alert.called);
});
it('up() should increase step', function() {
assert.equal(ladder.up().up().step, 2);
});
it('down() should decrease step', function() {
assert.equal(ladder.down().step, -1);
});
it('down().up().up().up() ', function() {
assert.equal(ladder.down().up().up().up().step, 2);
});
after(function() {
ladder.step = 0;
alert.restore();
});
});

View file

@ -0,0 +1,40 @@
The solution is to return the object itself from every call.
```js run
let ladder = {
step: 0,
up() {
this.step++;
*!*
return this;
*/!*
},
down() {
this.step--;
*!*
return this;
*/!*
},
showStep() {
alert( this.step );
*!*
return this;
*/!*
}
}
ladder.up().up().down().up().down().showStep(); // 1
```
We also can write a single call per line. For long chains it's more readable:
```js
ladder
.up()
.up()
.down()
.up()
.down()
.showStep(); // 1
```

View file

@ -0,0 +1,39 @@
importance: 2
---
# Chaining
There's a `ladder` object that allows to go up and down:
```js
let ladder = {
step: 0,
up() {
this.step++;
},
down() {
this.step--;
},
showStep: function() { // shows the current step
alert( this.step );
}
};
```
Now, if we need to make several calls in sequence, can do it like this:
```js
ladder.up();
ladder.up();
ladder.down();
ladder.showStep(); // 1
```
Modify the code of `up` and `down` to make the calls chainable, like this:
```js
ladder.up().up().down().showStep(); // 1
```
Such approach is widely used across Javascript libraries.