|
Цепочки вызовов
Подскажите, как создаются такие штуковины? Хочу понять принцип.
F(10).plus(5).minus(3); // => 12 |
Каждый метод должен возвращать объект с другими методами.
var MyObj = { myMethod1: function() { alert('1'); return this; }, myMethod2: function() { alert('2'); return MyObj; } }; MyObj.myMethod1().myMethod2().myMethod1().myMethod2(); |
Спасибо за ответ. Как в этом случае передать данные первому объекту?
|
Цитата:
|
Да, наверное. Взгляните на пример из первого поста. Пока понятно только с методами (.plus(5).minus(3)).
|
Цитата:
var F = function(x) { return { plus: function(y) { x += y; return this; }, minus: function(y) { x -= y; return this; }, getResult: function() { return x; } }; }; alert( F(10).plus(5).minus(3).getResult() ); Он плох тем, что при каждом вызове F создается новый объект, тем самым забивается память браузера. Вариант получше: var F = function(x) { return new F._f(x); }; F._f = function(x) { this.x = x; }; F._f.prototype.plus = function(y) { this.x += y; return this; }; F._f.prototype.minus = function(y) { this.x -= y; return this; }; F._f.prototype.getResult = function(y) { return this.x; }; alert( F(10).plus(5).minus(3).getResult() ); |
Спасибо, понятно. Однако в цепочке появился метод getResult. Существует ли способы вернуть результат автоматически, без появления отдельных методов в цепочке?
|
Цитата:
Number.prototype.plus = function(num) { return this + num; }; Number.prototype.minus = function(num) { return this - num; }; alert( (10).plus(5).minus(3) ); Для удобного наполнения объектов свойствами/методами обычно используют функцию Object.extend . Простейший вариант: Object.extend = function(self, obj) { for (var key in obj) self[key] = obj[key]; return self; }; И наполняем: Object.extend(Number.prototype, { plus: function(num) { return this + num; }, minus: function(num) { return this - num; } }); upd: не очень удачно получилось, здесь методов мало, при большом количестве методов с Object.extend все же удобней. |
Есть еще такой вариант:
function F(x) { x = new Number(x); x.plus = function(y) { return F(x + y); }; x.minus = function(y) { return F(x - y) }; return x; } alert(F(10).plus(5).minus(3)); |
Спасибо, все ясно. Ушел экспериментировать.
|
Часовой пояс GMT +3, время: 02:06. |
|